Python网络编程中recv完整接收数据的三种实现策略
本文深入探讨Python网络编程中利用recv函数完整接收数据的三种核心方法。首先介绍基于连接断开的接收策略,适用于短连接场景;其次解析通过协议尾标识定位完整报文的方法;最后详解基于负载长度字段进行边接收边解析的技术。文章提供具体代码实现,帮助开发者解决TCP通信中的数据完整性问题。
近期在开发一款通用的TCP客户端测试工具时,涉及Python网络编程。在基于Socket进行网络通信开发的过程中,如何准确判定对端发送的一条报文是否已接收完毕,是必须解决的关键问题。以下简要介绍判定数据接收完成的三种常用方法。
1. 基础数据接收法
采用基础数据接收法时,若与服务端Socket断开连接,程序将接收到空字符串。利用这一特性,可在程序中构建循环持续接收数据,直至数据发送端关闭Socket连接。该方法适用于客户端与服务器之间为短连接的场景(即一次Socket通讯后连接立即关闭)。具体代码如下:
import socket,struct,sys,time Port=22220 #assume a socket disconnect (data returned is empty string) means all data was #done being sent. def recv_basic(the_socket): total_data=[] while True: data = the_socket.recv(20480) if not data: break total_data.append(data) return ''.join(total_data)
2. 尾标识方法
该方法通过查找接收到的协议数据中的尾标识字符串,从而获取完整的数据报文。其适用场景为接收的协议数据中明确包含相关的尾标识。具体代码如下:
End='something useable as an end marker'
def recv_end(the_socket):
total_data=[];data=''
while True:
data=the_socket.recv(8192)
if End in data:
total_data.append(data[:data.find(End)])
break
total_data.append(data)
if len(total_data)>1:
#check if end_of_data was split
last_pair=total_data[-2]+total_data[-1]
if End in last_pair:
total_data[-2]=last_pair[:last_pair.find(End)]
total_data.pop()
break
return ''.join(total_data)3. 负载长度方法
即通过协议数据中的负载长度值来确定有效报文的长度。该方法适用于协议数据中包含负载协议字段的场景。这是一种较为常用且通用的方法,但需要在接收数据的同时进行解析。具体代码如下:
def recv_size(the_socket):
#data length is packed into 4 bytes
total_len=0;total_data=[];size=sys.maxint
size_data=sock_data='';recv_size=8192
while total_len<size:
sock_data=the_socket.recv(recv_size)
if not total_data:
if len(sock_data)>4:
size_data+=sock_data
size=struct.unpack('>i', size_data[:4])[0]
recv_size=size
if recv_size>524288:recv_size=524288
total_data.append(size_data[4:])
else:
size_data+=sock_data
else:
total_data.append(sock_data)
total_len=sum([len(i) for i in total_data ])
return ''.join(total_data)以上内容为本文的全部介绍,希望这些内容能对各位的学习或工作有所帮助,同时也欢迎大家继续支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













