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

Python套接字接收-传入的数据包始终具有不同的大小

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

Python套接字接收-传入的数据包始终具有不同的大小

网络 总是 不可预测的。TCP使许多这种随机行为为您消除。TCP要做的一件奇妙的事情:它确保字节将以相同的顺序到达。但!它 不能
保证它们会以相同的方式切碎。您根本 无法 假设连接一端的每个send()都会导致远端上的一个recv()的字节数完全相同。

当您说时

socket.recv(x)
,您的意思是“直到您从套接字读取了x个字节后,才返回”。这称为“阻止I /
O”:您将阻止(等待)直到您的请求得到满足。如果协议中的每条消息都恰好是1024字节,则调用
socket.recv(1024)
将非常有用。但这听起来不对。如果您的消息是固定的字节数,只需将该数字传递给
socket.recv()
您就可以了。

但是,如果您的邮件可以具有不同的长度怎么办?您需要做的第一件事:停止

socket.recv()
使用明确的电话号码。改变这个:

data = self.request.recv(1024)

对此:

data = self.request.recv()

recv()
只要获得新数据,均值将始终返回。

但是现在您遇到了一个新问题:您怎么知道发件人何时向您发送了完整的消息?答案是:您不知道。您将必须使消息的长度成为协议的明确部分。最好的方法是:为每个消息加一个前缀,长度可以是固定大小的整数(使用

socket.ntohs()
socket.ntohl()
Please转换为网络字节顺序),也可以是字符串后跟一些定界符(例如‘123:’)。第二种方法通常效率较低,但在Python中更容易。

once you’ve added that to your protocol, you need to change your pre to
handle

recv()
returning arbitrary amounts of data at any time. Here’s an
example of how to do this. I tried writing it as pseudo-pre, or with comments
to tell you what to do, but it wasn’t very clear. So I’ve written it
explicitly using the length prefix as a string of digits terminated by a
colon. Here you go:

length = Nonebuffer = ""while True:  data += self.request.recv()  if not data:    break  buffer += data  while True:    if length is None:      if ':' not in buffer:        break      # remove the length bytes from the front of buffer      # leave any remaining bytes in the buffer!      length_str, ignored, buffer = buffer.partition(':')      length = int(length_str)    if len(buffer) < length:      break    # split off the full message from the remaining bytes    # leave any remaining bytes in the buffer!    message = buffer[:length]    buffer = buffer[length:]    length = None    # PROCESS MESSAGE HERE


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

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

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