我已经设置了一个服务器,重用 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/