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_INET6SOCK_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




