我一般都在考虑通过TCP为自己的目的编写一个协议,并且遇到了确定消息结束的问题。
从HTTP派生,我可以看到内容长度中提到了消息长度,并且可能是确定消息已被完全接收的方法。这是唯一的方法吗?如果缺少此标头会发生什么,因为AFAIK标头在HTTP消息中是可选的。
感谢。
答案 0 :(得分:3)
这是唯一的方法吗?
还有其他方法,例如
有一个特殊的分隔符标记结尾(也许是下一条消息的开头)。例如你可以使用换行符结束所有消息,所以要读取消息,你要读取所有内容直到换行。在这种情况下,您需要确保邮件内容本身不包含换行符,例如:在阅读时发送和取消转义时,在邮件中转义换行符。或者使用不包含换行符的编码对消息进行编码(例如base64或ascii-hex)
格式化消息,使其包含一个结构,解析器将隐式检测消息的开始和结束。例如如果您发送json,则必须在收到数据时解析json,并且一旦匹配了所有{
和[
个字符,您就会收到一条消息。
为每条消息添加长度前缀。这非常类似于HTTP中的“Content-Length”,而是用二进制编码长度,例如每条消息的前4个字节保存后面数据的长度。
如果缺少此标头会发生什么,因为AFAIK标头在HTTP消息中是可选的。
这更棘手,因为有很多案件都在处理这个问题。
e.g。对于HTTP / 1.0,如果实际存在正文,则请求中必须有Content-Length。对于HTTP / 1.1,请求可能包含某些内容编码(例如,分块编码),其中可以在消息正文中解析长度。
对于http响应,可以通过关闭连接来指示消息的结尾,从头的末尾到流的末尾的所有内容都将被视为“消息”。更多信息here
答案 1 :(得分:0)
了解消息完成位置的其他方法 - 发送后关闭套接字)。但最好使用内容长度等内容。
当我编写自己的http服务器时:我编写的程序会关闭所有带有内容长度的http post数据包。
答案 2 :(得分:0)