Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字缓冲:消息帧_Python_Sockets_Tcp Ip - Fatal编程技术网

Python套接字缓冲:消息帧

Python套接字缓冲:消息帧,python,sockets,tcp-ip,Python,Sockets,Tcp Ip,我在TCP/IP套接字上接收从外部硬件(Zigbee接收器)到PC的数据流(46字节)。然后,通过使用Python编程,iam尝试从TCP/IP套接字接收的数据流中提取消息 我的python源代码和从数据流中提取的数据,在下面的链接中给出 正如我们所知,“TCP/IP在数据流上运行,而不是通过数据包” 如果我在单个流中收到完整的数据包,我就能够提取数据。但有时,单个数据包在两个数据流中接收(断开),那一次我无法从数据流中提取消息 我不太熟悉python编程,所以谁能帮我解决这个问题呢 我正在寻

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

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

正如我们所知,“TCP/IP在数据流上运行,而不是通过数据包”

如果我在单个流中收到完整的数据包,我就能够提取数据。但有时,单个数据包在两个数据流中接收(断开),那一次我无法从数据流中提取消息

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

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

提前感谢

这应该可以:

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])
    ...
导入套接字
def连接(地址):
con=socket.socket(socket.AF\u INET,socket.SOCK\u流)
con.connect(地址)
返回控制
地址=('127.0.0.1',7777)
客户端\u套接字=连接(地址)
数据包大小=46
data=“”
尽管如此:
而len(数据)<数据包大小:
d=客户端\u套接字.recv(1024)
如果不是d:
client_socket.close()
客户端\u套接字=连接(地址)
其他:
数据+=d
数据包,数据=数据[:数据包大小],数据[数据包大小:]
lqi=ord(数据包[27])
...

+1,我唯一关心的是您应该检查
recv
是否没有返回空字符串来表示已关闭连接。谢谢。我已经更新了代码,以便在连接关闭时重新连接。它工作正常,现在数据流中没有任何中断,我可以继续接收数据流。但是,我仍然体验到数据流中的数据丢失,对于这种数据丢失,我没有什么疑问。在TCP/IP套接字中