You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python程序多线程并行执行及server.py Socket代码解析求助

解析server.py中的Socket通信代码

先把补全截断部分后的完整代码贴出来:

import socket
sock = socket.socket(socket.AF_INET ,socket.SOCK_STREAM)
print "socket success"
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1',9999))
print "binded success fully"
sock.listen(5)
while True :
    print "waiting for connection"
    conn,addr = sock.accept()
    while True :
        print conn.recv(30)
        data = "Ack for msg1 client sender 1"
        conn.send(data)
        print "data send success"
        print "waiting for responce comming from client sender2"
        response = conn.recv(30)
        print response

逐行拆解代码逻辑

我会一步步给你解释每一行的作用:

  • import socket:导入Python标准库的socket模块,这是实现TCP/UDP网络通信的基础工具。
  • sock = socket.socket(socket.AF_INET ,socket.SOCK_STREAM):创建一个Socket实例
    • AF_INET:指定用IPv4地址格式来通信;如果是IPv6则用AF_INET6
    • SOCK_STREAM:指定使用TCP协议,这是一种可靠的、面向连接的通信方式,适合需要确保数据完整传输的场景。
  • print "socket success":打印提示,确认Socket对象创建成功——注意这是Python 2.x的语法,Python 3.x里必须写成print("socket success")
  • sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1):设置Socket的复用选项
    • SO_REUSEADDR:允许程序关闭端口后立即重新使用该端口,避免调试时出现“地址已被占用”的报错,非常实用。
  • sock.bind(('127.0.0.1',9999)):把Socket绑定到本地回环地址127.0.0.1和端口9999——回环地址意味着只有本机的程序能连接这个服务,外部设备访问不了。
  • print "binded success fully":提示绑定操作完成。
  • sock.listen(5):开启监听模式,参数5是等待队列的最大长度——如果同时有多个客户端请求连接,最多能让5个请求排队,超过的会被直接拒绝。
  • 外层while True::这是一个死循环,会一直运行,持续等待新的客户端连接。
    • print "waiting for connection":提示正在等待客户端接入。
    • conn,addr = sock.accept():接受客户端的连接请求,返回两个值:
      • conn:一个新的Socket对象,专门用来和这个客户端收发数据
      • addr:客户端的IP地址和端口号,方便你知道是谁连过来的
    • 内层while True::和已连接的客户端持续通信,直到连接断开。
      • print conn.recv(30):接收客户端发来的数据,最多接收30个字节,然后打印出来。如果客户端没发数据,这个方法会阻塞,直到收到数据或者连接断开。
      • data = "Ack for msg1 client sender 1":准备给客户端的确认消息,告诉客户端“我收到你的第一条消息了”。
      • conn.send(data):把这条确认消息发送给客户端。
      • print "data send success":提示消息发送成功。
      • print "waiting for responce comming from client sender2":提示等待客户端的第二条消息。
      • response = conn.recv(30):接收客户端的第二条消息,最多30字节。
      • print response:打印收到的第二条消息。

代码的几个小问题和改进建议

  • 版本兼容问题:这是Python 2.x的代码,在Python 3.x中会报错,需要把所有print语句改成带括号的形式,比如print("socket success")
  • 缺乏异常处理:如果客户端突然断开连接,recv()会抛出ConnectionResetError之类的异常,直接导致程序崩溃。建议加try-except块捕获异常,优雅关闭连接。
  • 单线程瓶颈:这个服务同一时间只能处理一个客户端,后面的客户端会一直阻塞在等待队列里。如果要支持多客户端同时连接,建议结合threading模块,每收到一个新连接就创建一个线程来处理通信,这样就能实现多客户端并发服务了。

内容的提问来源于stack exchange,提问作者jhon

火山引擎 最新活动