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

时间:2012-08-05 10:18:07

标签: python protocol-buffers

我已经设置了一台服务器,重复使用我self.data = self.request.recv(1024).strip() Message.proto documentation中的代码。

但是我如何从这里开始,将其反序列化为protobuf消息(Message_pb2.py / {{1}})。现在它似乎正在接收1024个字节的块,当时多于一个......使它成为垃圾:D

1 个答案:

答案 0 :(得分:3)

TCP通常只是一个数据流。仅仅因为您将每个数据包作为一个单元发送,并不意味着接收器就是这样。大消息可以分成多个数据包;小消息可以组合成一个数据包。

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

然后,阅读是一个问题:

  • 读取整个长度标题
  • 读取(和缓冲)那么多字节
  • 处理缓冲数据
  • 冲洗并重复

但请记住,您可能(在单个数据包中)有一条消息的 end ,2条完整消息,以及另一条消息的 start (可能是一半)长度标题,只是为了让它变得有趣)。所以:在任何时候跟踪你正在阅读的内容都变得至关重要。

相关问题