栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python Socket接收大量数据

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python Socket接收大量数据

TCP / IP是基于 流的 协议,而不是基于 消息的
协议。不能保证

send()
一个对等方的每个呼叫都会导致另一对等方的单个
recv()
呼叫接收到发送的确切数据
recv()
,由于数据包分段,它可能会接收到数据块,并分成多个呼叫。

您需要在TCP之上定义自己的基于消息的协议,以区分消息边界。然后,要阅读消息,请继续呼叫

recv()
直到您阅读了整个消息或发生错误为止。

发送消息的一种简单方法是为每个消息加上前缀。然后要读取一条消息,您首先要读取长度,然后读取那么多字节。您可以按照以下方式进行操作:

def send_msg(sock, msg):    # Prefix each message with a 4-byte length (network byte order)    msg = struct.pack('>I', len(msg)) + msg    sock.sendall(msg)def recv_msg(sock):    # Read message length and unpack it into an integer    raw_msglen = recvall(sock, 4)    if not raw_msglen:        return None    msglen = struct.unpack('>I', raw_msglen)[0]    # Read the message data    return recvall(sock, msglen)def recvall(sock, n):    # Helper function to recv n bytes or return None if EOF is hit    data = bytearray()    while len(data) < n:        packet = sock.recv(n - len(data))        if not packet: return None        data.extend(packet)    return data

然后,您可以使用

send_msg
recv_msg
函数来发送和接收整个消息,并且它们不会对数据包在网络级别被拆分或合并产生任何问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/611212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号