Python Socket循环定时发送数据时服务器接收空包的问题求助
问题排查与解决方案
我来帮你揪出这个自动发送客户端的问题根源!结合你手动客户端能正常运行的情况,主要问题和优化点如下:
1. 核心问题:错误的字节编码方式
你当前代码里用bytes(pacote, "utf-8")把十六进制字符串转成字节流,但这和手动客户端的逻辑大概率不一致。
举个例子:字符串'2B4F08FE0F3B'用utf-8编码的话,每个字符会被转成对应的ASCII字节(比如'2'变成0x32,'B'变成0x42),但服务器期望的应该是将十六进制字符串解码为原始字节(比如'2B'对应0x2B,'4F'对应0x4F)。这种编码差异会导致服务器收到的数据完全不符合预期,看起来像是空包。
正确的转换方式应该用bytes.fromhex(pacote),这会把十六进制字符串直接解析为对应的字节数组,和你手动客户端的行为保持一致。
2. 冗余代码优化
你把localip、port、bufferSize这些固定变量放在循环内部,每次循环都重新定义,虽然不影响功能,但把它们移到循环外会让代码更简洁高效。
3. 确保数据完全发送
虽然TCP是可靠传输,但在send后立刻调用close(),极端情况下可能出现数据还没完全从客户端缓冲区发送到服务器就断开连接的情况。可以在关闭连接前调用client.shutdown(socket.SHUT_WR),明确告诉服务器客户端不会再发送数据,确保缓冲区的数据全部发送完毕。
修正后的完整代码
import socket import time # 固定配置移到循环外 localip = '127.0.0.1' port = 5010 for i in range(100): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) client.connect((localip, port)) pacote = '2B4F08FE0F3B' # 正确将十六进制字符串转为字节 client.send(bytes.fromhex(pacote)) # 关闭发送方向,确保数据全部发送 client.shutdown(socket.SHUT_WR) client.close() time.sleep(10)
这个版本应该能解决服务器收到空包的问题,同时满足你“每次发送新建连接、间隔10秒发送100次”的需求。
内容的提问来源于stack exchange,提问作者Guilherme Londero
相关产品推荐
相关产品推荐

