可变长度消息的 TCP 传输
TCP transfer of messages of variable length
通过 TCP 正确编码和解析可变长度消息的方法是什么?例如,假设我们要发送一条由字符串文本和二进制文件混合组成的消息。
这取决于您在 TCP 之上实施的协议。它的说明书会告诉你正确的使用方法。
如果您正在设计协议,通常您只需遵循与您正在做的事情最接近的任何现有协议的设计。常见方案包括:
您将每条消息编码为以换行符结尾的文本。接收方只是读取数据块并在其中搜索换行符。
您将每条消息编码为可变长度块,并在每个块之前发送一个 4 字节整数长度(按网络字节顺序)。接收方读取数据块,当它有 4 个字节时,它确定消息的长度,当它有更多字节时,它“剪掉”消息并解析任何剩余的。
您将消息编码为 XML 或 JSON 等格式。
只是添加到这个线程中已经发布的优秀答案。
如果您的问题是为了教育,您可以查看 RFC 6455, Section 5.2 WebSocket 协议中消息的结构。
如果您需要通过 TCP 实现通信,您还可以通过重用现有的 RPC 协议来节省时间,例如 gRPC、Apache Thrift、XML-RPC、JSON-RPC 等等其他。提到的 WebSocket 协议也可以被非浏览器客户端使用(如果你打算在未来将功能扩展到浏览器,这可能是一个不错的选择)。
大多数 MessagePack 库还允许您从流中反序列化 MessagePack 编码而不提供其长度,因此您可以通过套接字发送和接收 MessagePack 消息来简单地交谈。
通过 TCP 正确编码和解析可变长度消息的方法是什么?例如,假设我们要发送一条由字符串文本和二进制文件混合组成的消息。
这取决于您在 TCP 之上实施的协议。它的说明书会告诉你正确的使用方法。
如果您正在设计协议,通常您只需遵循与您正在做的事情最接近的任何现有协议的设计。常见方案包括:
您将每条消息编码为以换行符结尾的文本。接收方只是读取数据块并在其中搜索换行符。
您将每条消息编码为可变长度块,并在每个块之前发送一个 4 字节整数长度(按网络字节顺序)。接收方读取数据块,当它有 4 个字节时,它确定消息的长度,当它有更多字节时,它“剪掉”消息并解析任何剩余的。
您将消息编码为 XML 或 JSON 等格式。
只是添加到这个线程中已经发布的优秀答案。
如果您的问题是为了教育,您可以查看 RFC 6455, Section 5.2 WebSocket 协议中消息的结构。
如果您需要通过 TCP 实现通信,您还可以通过重用现有的 RPC 协议来节省时间,例如 gRPC、Apache Thrift、XML-RPC、JSON-RPC 等等其他。提到的 WebSocket 协议也可以被非浏览器客户端使用(如果你打算在未来将功能扩展到浏览器,这可能是一个不错的选择)。
大多数 MessagePack 库还允许您从流中反序列化 MessagePack 编码而不提供其长度,因此您可以通过套接字发送和接收 MessagePack 消息来简单地交谈。