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

标签 python protocol-buffers

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

但是我该如何继续,将其反序列化为 protobuf 消息(Message.proto/Message_pb2.py)。现在看来它正在接收 1024 字节的 block ,而且当时还不止一个……这一切都是垃圾:D

最佳答案

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

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

那么,阅读就是:

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

但请记住,您可能(在单个数据包中)包含一条消息的结束、2 条完整消息以及另一条消息的开始(可能是一半)长度标题,只是为了让它变得有趣)。因此:随时准确跟踪您正在阅读的内容变得至关重要。

关于python - 如何反序列化 TCP 服务器上的传入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815624/

相关文章:

python - Python 中可调用对象的多态性

python - Flake8 抛出 B008 fastapi 数据类型定义

python - 如何访问 Tensorflow 中循环单元的权重?

java - 在另一个 PB 消息中存储未指定的 Protocol Buffer 消息?

反序列化 protobuf 消息时出现 java.lang.NoClassDefFoundError

f# - Protocol Buffer 是否可用于 F#?

c++ - 测试 protobuf 消息的覆盖率

python - 使用基本的低级 TensorFlow 训练循环训练 tf.keras 模型不起作用

python - 我如何在 python 的 Windows 上安装 boto 库?

networking - protobuf 与 gRPC