Python socket客户端发命令后recv阻塞无响应问题排查
socket交互卡顿问题排查
根本原因
程序卡在等待命令响应的核心问题是发送的命令缺少服务端要求的结束终止符:
- 日常使用telnet连接服务、输入完命令按回车的操作,本质是telnet客户端会自动在命令文本末尾追加换行终止符(常见为
\r\n)再发送给服务端;服务端的逻辑是靠识别这个换行符,判定收到了一条完整、待处理的命令,才会执行逻辑并返回对应响应。 - 当前代码中直接编码发送
current-time字符串,没有携带这个换行结束标识,服务端会一直处于「等待当前命令接收完整」的状态,不会触发响应逻辑,最终导致recv方法永久阻塞。
代码修正方案
将原代码第8行的发送逻辑,修改为和telnet实际发送格式一致的内容:
# 原代码:client.send('current-time'.encode()) # 修改为: client.send('current-time\r\n'.encode())
后续适配注意事项
- 如果修改后依然没有响应,可以手动核对服务端要求的命令结束格式,部分老旧服务端仅识别单个
\n作为终止符,可替换为'current-time\n'.encode()再测试。 - 当前代码单次调用
recv(4096)的写法没有处理TCP传输的粘包、半包问题,后续要做稳定循环交互时,建议按照服务端约定的响应结束标识(通常也是换行符)循环读取字节流,直到匹配到结束标记后再停止单次响应的读取,避免因为响应被拆分成多个TCP包导致读取不完整。
内容的提问来源于stack exchange,提问作者victornoleto
相关产品推荐
相关产品推荐

