【问题标题】:Python socket Buffering: Message FramingPython 套接字缓冲:消息框架
【发布时间】:2012-07-12 16:52:15
【问题描述】:

我正在通过 TCP/IP 套接字从外部硬件(Zigbee 接收器)接收数据流(46 字节)到 PC。然后通过 Python 编程,尝试从 TCP/IP 套接字接收到的数据流中提取消息。

我的 python 源代码和从数据流中提取的数据,在下面的链接中给出

https://docs.google.com/document/pub?id=1pYASqImWm4HkKrDbeeal8fTBsh_GojBQLXixxbMQBlU

我们知道“TCP/IP 操作数据流,而不是数据包”

如果我在单个流中收到完整的数据包,我可以提取数据。但有时,在两个数据流中接收到单个数据包(损坏),那时我无法从流中提取我的消息。

我对python编程不太熟悉,所以谁能帮我解决这个问题。

我正在寻找任何好的示例(编程)来管理 TCP/IP 套接字上传入数据流的中断,方法是将这些流作为完整数据包存储在缓冲区中,然后使用分隔符提取消息。

提前致谢

【问题讨论】:

    标签: python sockets tcp-ip


    【解决方案1】:

    这应该可行:

    import socket
    
    def connect(addr):
        con = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        con.connect(addr)
        return con 
    
    addr = ('127.0.0.1', 7777)
    client_socket = connect(addr)
    packet_size = 46
    data = ""
    while True:
        while len(data) < packet_size:
            d = client_socket.recv(1024)
            if not d:
                client_socket.close()
                client_socket = connect(addr) 
            else:
                data += d
        packet, data = data[:packet_size], data[packet_size:]
        lqi = ord(packet[27])
        ...
    

    【讨论】:

    • +1,我唯一关心的是你应该检查recv是否没有返回一个空字符串来表示关闭的连接。
    • 谢谢。我已更新代码以在连接关闭时重新连接。
    • 它工作得很好,现在我的数据流没有任何中断,我可以继续接收数据流。但是,我仍然在流中遇到数据丢失,
    • 我对这种数据丢失几乎没有疑问。在 TCP/IP 套接字中
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多