You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python TCP Socket接收Vesta中央站XML数据异常问题求助

问题分析与解决方案

核心问题

  1. TCP流式传输特性:recv(1024)每次仅获取部分数据,单块数据无法构成完整XML,导致打印分散或混乱。
  2. 错误处理缺失:当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:06:16