Python TCP Socket接收Vesta中央站XML数据异常问题求助
问题分析与解决方案
核心问题
- TCP流式传输特性:
recv(1024)每次仅获取部分数据,单块数据无法构成完整XML,导致打印分散或混乱。 - 错误处理缺失:当Vesta中央站断开连接后,
connection.recv()会返回空字节,若继续操作会触发[Errno 9] Bad file descriptor错误。
修正后的代码
import socket server_address = ('xxxxxxx', 1234) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(server_address) sock.listen(1) print("等待Vesta中央站连接...") connection, client_address = sock.accept() print(f"已连接:{client_address}") try: xml_buffer = b'' # 根据Vesta实际返回的XML根结束标签调整,示例为</Packet> end_tag = b'</Packet>' while True: chunk = connection.recv(4096) if not chunk: print("连接已断开") break xml_buffer += chunk if end_tag in xml_buffer: # 拆分完整XML与剩余数据 complete_xml, remaining = xml_buffer.split(end_tag, 1) complete_xml += end_tag decoded_xml = complete_xml.decode('utf-8') print("完整XML数据:") print(decoded_xml) xml_buffer = remaining finally: connection.close() sock.close()
关键改进点
- 数据拼接缓冲区:用
xml_buffer累积接收的数据,直到检测到XML结束标记,确保处理完整文档。 - 连接关闭处理:
recv()返回空字节时,立即退出循环并关闭资源,避免无效操作触发错误。 - 缓冲区优化:增大
recv缓冲区至4096字节,减少调用次数提升效率(可根据实际数据大小调整)。 - 资源安全清理:通过
try...finally确保连接和socket始终被正确关闭,避免资源泄漏。
额外注意事项
- 确认Vesta返回的XML结束标签,若不是
</Packet>需替换为实际标记。 - 若Vesta使用非UTF-8编码,需将
decode('utf-8')改为对应编码(如GBK)。 - 代码支持连续处理多个XML数据包,剩余未完整的数据会自动存入缓冲区等待后续拼接。
内容的提问来源于stack exchange,提问作者Kost
相关产品推荐
相关产品推荐

