本文介绍了python发送和接收大数据的思路:
发送方提供要发送数据的长度,接收方根据数据长度,循环接收数据,直到全部接收。并采用自定义的header结构体,保证每次数据传送的独立。
发送方代码示例:
# 自定义header
def build_header(data_len):
header = {'data_len': data_len}
return json.dumps(header).encode('UTF-8')
# 发送报文
def send(client, message):
data_len = len(message)
header = build_header(data_len)
header_len = len(header)
struct_bytes = struct.pack('i', header_len)
# 粘包发送
client.send(struct_bytes)
client.send(header)
client.send(message.encode('UTF-8'))
接收方代码示例:
# 接收报文
def recv(client_conn):
# 拆包接收
struct_bytes = client_conn.recv(4)
header_len = struct.unpack('i', struct_bytes)[0]
header_bytes = client_conn.recv(header_len)
header = json.loads(header_bytes.decode('UTF-8'))
data_len = header['data_len']
# 循环接收数据
gap_abs = data_len % 1024
count = data_len // 1024
recv_data = b''
for i in range(count):
data = client_conn.recv(1024, socket.MSG_WAITALL)
recv_data += data
recv_data += client_conn.recv(gap_abs, socket.MSG_WAITALL)
return recv_data
另,根据《python参考手册》查看recv函数接口除了size之外,还有一个flag参数,有一个选项是:MSG_WAITALL,表示在接收的时候,函数一定会等待接收到指定size之后才会返回。



