可变长度消息的 TCP 传输
Posted
技术标签:
【中文标题】可变长度消息的 TCP 传输【英文标题】:TCP transfer of messages of variable length 【发布时间】:2021-07-13 21:46:43 【问题描述】:通过 TCP 正确编码和解析可变长度消息的方法是什么?例如,假设我们要发送一条由字符串文本和二进制文件混合而成的消息。
【问题讨论】:
【参考方案1】:这取决于您在 TCP 上实现的协议。它的规范会告诉你正确的使用方法。
如果您正在设计协议,通常您只需遵循与您正在做的最接近的现有协议的设计即可。常见的方案包括:
您将每条消息编码为以换行符结尾的文本。接收方只是读取数据块并在其中搜索换行符。
您将每条消息编码为可变长度块,并在每个块之前发送一个 4 字节整数长度(按网络字节顺序)。接收方读取数据块,当它有 4 个字节时,它确定消息的长度,当它有更多字节时,它“剪断”消息并解析任何剩余的。
您以 XML 或 JSON 等格式对消息进行编码。
【讨论】:
【参考方案2】:只是添加到这个帖子中已经发布的优秀答案。
如果您的问题的目的是教育,您可以查看RFC 6455, Section 5.2 如何在 WebSocket 协议中构建消息。
如果您需要通过 TCP 实现通信,您还可以通过重用现有的 RPC 协议来节省时间,例如 gRPC、Apache Thrift、XML-RPC、JSON-RPC 等。非浏览器客户端也可以使用上述 WebSocket 协议(如果您计划将来将功能扩展到浏览器,这可能是一个不错的选择)。
大多数MessagePack 库还允许您从流中反序列化 MessagePack 编码而不提供其长度,因此您可以通过套接字发送和接收 MessagePack 消息来简单地交谈。
【讨论】:
以上是关于可变长度消息的 TCP 传输的主要内容,如果未能解决你的问题,请参考以下文章