0

我通常考虑通过 TCP 为自己的目的编写一个协议,并遇到了确定消息结尾的问题。

从 HTTP 派生,我可以看到 Content-length 中提到了消息长度,并且可能是确定消息已完全接收的方法。这是唯一的方法吗?如果缺少此标头会发生什么,因为 AFAIK 标头在 HTTP 消息中是可选的。

谢谢。

4

3 回答 3

3

这是唯一的方法吗?

还有其他方法,例如

  • 有一个特殊的分隔符标记结束(也许是下一条消息的开始)。例如,您可以用换行符结束所有消息,因此要阅读消息,您需要阅读所有内容,直到换行符为止。在这种情况下,您需要确保消息内容本身不包含换行符,例如在发送时转义消息中的换行符并在阅读时取消转义。或者使用不包含换行符的编码(例如 base64 或 ascii-hex)对消息进行编码

  • 格式化消息,使其包含一个结构,解析器将隐式检测消息的开始和结束。例如,如果您发送 json,则必须在接收数据时解析 json,并且一旦匹配所有{[字符,您就会收到完整的消息。

  • 在每条消息前面加上一个长度。这很像 HTTP 中的“Content-Length”,但您将长度编码为二进制,例如,每条消息的前 4 个字节保存随后数据的长度。

如果缺少此标头会发生什么,因为 AFAIK 标头在 HTTP 消息中是可选的。

这更棘手,因为有很多案例处理这个问题。

例如,对于 HTTP/1.0,如果确实有正文,则请求中必须有 Content-Length。对于 HTTP/1.1,请求可能包含某些内容编码(例如分块编码),其中长度可以在消息正文中解析出来。

对于http响应,可以通过关闭连接来指示消息的结束,从headers的末尾到流的末尾的所有内容都将被视为一个“消息”。更多信息在这里

于 2011-08-02T23:25:31.740 回答
0

知道消息在哪里完成的其他方式 - 发送后关闭套接字)。但最好使用内容长度之类的东西。

当我编写自己的http服务器时:我编写了关闭所有http post数据包而没有内容长度的程序。

于 2011-08-02T22:02:58.603 回答
0

HTTPbis 第 1 部分,第 3.3 节

于 2011-08-03T08:17:02.937 回答