Python 如何反序列化TCP服务器上的传入数据?

Python 如何反序列化TCP服务器上的传入数据?,python,protocol-buffers,Python,Protocol Buffers,我已经设置了一个服务器,该服务器将重用我在where haveself.data=self.request.recv(1024.strip()中找到的代码 但是我如何从这里开始,将其反序列化为protobuf消息(message.proto/message\u pb2.py)。现在它似乎正在接收1024字节的数据块,而且一次接收的数据块不止一个。。。让一切都变成垃圾:DTCP通常只是一个数据流。仅仅因为你把每个数据包作为一个单元发送,并不意味着接收者就得到了它。大消息可以被分成多个数据包;小消息

我已经设置了一个服务器,该服务器将重用我在where have
self.data=self.request.recv(1024.strip()
中找到的代码


但是我如何从这里开始,将其反序列化为protobuf消息(
message.proto
/
message\u pb2.py
)。现在它似乎正在接收1024字节的数据块,而且一次接收的数据块不止一个。。。让一切都变成垃圾:D

TCP通常只是一个数据流。仅仅因为你把每个数据包作为一个单元发送,并不意味着接收者就得到了它。大消息可以被分成多个数据包;小消息可以组合成单个数据包

通过TCP解释多条消息的唯一方法是使用某种“框架”。对于基于文本的协议,一个CR/LF/CRLF/zero字节可能表示每个帧的结束,但对于protobuf这样的二进制协议来说,这是行不通的。在这种情况下,最常见的方法是简单地在每条消息前面加上长度,例如在固定大小(4字节?)的网络字节顺序块中。然后是有效载荷。在protobuf的情况下,您平台的API还可以提供一种机制,将长度写入“变量”

那么,阅读就是一个问题:

  • 读取整个长度的标题
  • 读取(和缓冲)那么多字节
  • 处理缓冲数据
  • 冲洗并重复
但请记住,您可能(在一个数据包中)有一条消息的结尾、两条完整消息和另一条消息的开头(可能是长度头的一半,只是为了让它有趣)。因此:在任何时候准确地跟踪你正在阅读的内容变得至关重要