Python Socket服务端读取客户端多命令的顺序匹配异常问题
问题诱因
- 服务端命令接收逻辑为硬编码固定顺序:服务端与客户端建立TCP连接后,会先后执行两次
recv()操作,第一次强制校验收到的命令必须为ABC,第二次强制校验必须为DEF,只要任意一次不符合顺序就会执行break直接终止当前连接的处理逻辑,不会响应后续命令。当客户端调整发送顺序为DEF-ABC时,服务端第一次接收就匹配不到ABC,直接跳出处理流程,自然仅能收到最多一次响应甚至无响应。 - 代码存在语法与逻辑缺陷:
- 服务端
c.close()缩进错误,位于break分支之后,正常流程也无法执行到,会导致连接资源泄漏; - 原有代码为Python2语法,
print语法、字符串直接收发的逻辑在Python3环境下运行会直接报错; - 没有做TCP粘包、半包的兼容处理,极端场景下会出现命令识别错误。
- 服务端
解决方案
核心逻辑改造
将服务端固定顺序的命令校验改为循环接收模式,每次收到命令后判断是否为ABC或DEF,匹配任意一个就返回OK,支持任意顺序的命令请求。
修复后服务端参考代码
import socket host = socket.gethostname() port = 12345 server_tcp = socket.socket() server_tcp.bind((host, port)) server_tcp.listen(5) while True: c, addr = server_tcp.accept() try: while True: data = c.recv(1024) # 客户端断开连接时recv返回空,跳出循环 if not data: break # 字节转字符串,适配Python3 data = data.decode('utf-8') print(f'data received: {data}') if data in ('ABC', 'DEF'): print('sending back ok to the client') c.send('OK'.encode('utf-8')) else: print(f'I did not get the right command: {data}') break finally: # 保证连接一定会关闭 c.close()
修复后客户端参考代码(适配Python3+支持自定义发送顺序)
import socket host = socket.gethostname() port = 12345 client_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: client_tcp.connect((host, port)) except Exception as e: print('Server not found') exit() # 可自由调整发送顺序 send_commands = ['DEF', 'ABC'] for cmd in send_commands: client_tcp.send(cmd.encode('utf-8')) data = client_tcp.recv(1024).decode('utf-8') print(data) if data == 'OK': print('good') else: print('bad') client_tcp.close()
其他优化建议
如果要实现更可靠的TCP通信,可在命令前后增加分隔符或者固定长度的包头,避免粘包、半包导致的命令解析错误。
内容的提问来源于stack exchange,提问作者fpga
相关产品推荐
相关产品推荐

