2

我已经设置了一个服务器,它重用了我拥有的文档self.data = self.request.recv(1024).strip()中的代码。

但是我该如何从这个开始,将其反序列化为 protobuf 消息(Message.proto/ Message_pb2.py)。现在它似乎正在接收 1024 字节的块,而且当时不止一个......让它变得很垃圾:D

4

1 回答 1

3

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

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

然后,阅读是一个问题:

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

但请记住,您可能(在单个数据包中)有一条消息的结尾、两条完整的消息和另一条消息的开头(可能是长度标头的一半,只是为了让它变得有趣)。所以:在任何时候准确地跟踪你正在阅读的内容变得至关重要。

于 2012-08-05T11:21:06.550 回答