Python套接字缓冲:消息帧
我在TCP/IP套接字上接收从外部硬件(Zigbee接收器)到PC的数据流(46字节)。然后,通过使用Python编程,iam尝试从TCP/IP套接字接收的数据流中提取消息 我的python源代码和从数据流中提取的数据,在下面的链接中给出 正如我们所知,“TCP/IP在数据流上运行,而不是通过数据包” 如果我在单个流中收到完整的数据包,我就能够提取数据。但有时,单个数据包在两个数据流中接收(断开),那一次我无法从数据流中提取消息 我不太熟悉python编程,所以谁能帮我解决这个问题呢 我正在寻找任何好的示例(编程)来管理TCP/IP套接字上输入数据流的中断,方法是将这些数据流作为完整数据包存储在缓冲区中,然后使用分隔符提取消息 提前感谢这应该可以:Python套接字缓冲:消息帧,python,sockets,tcp-ip,Python,Sockets,Tcp Ip,我在TCP/IP套接字上接收从外部硬件(Zigbee接收器)到PC的数据流(46字节)。然后,通过使用Python编程,iam尝试从TCP/IP套接字接收的数据流中提取消息 我的python源代码和从数据流中提取的数据,在下面的链接中给出 正如我们所知,“TCP/IP在数据流上运行,而不是通过数据包” 如果我在单个流中收到完整的数据包,我就能够提取数据。但有时,单个数据包在两个数据流中接收(断开),那一次我无法从数据流中提取消息 我不太熟悉python编程,所以谁能帮我解决这个问题呢 我正在寻
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套接字中