编写流协议:消息大小字段或消息分隔符?

jbu*_*jbu 11 message protocols stream delimiter terminator

我即将编写一个通过TCP流的消息协议.接收方需要知道消息边界的位置.

我可以发送1)固定长度的消息,2)大小字段,以便接收者知道消息有多大,或3)唯一的消息终止符(我猜这不能在消息中的任何其他地方使用).

出于效率原因,我不会使用#1.

我喜欢#2,但是流可能会失去同步吗?

我不喜欢#3的想法,因为它意味着接收者不能提前知道消息的大小,并且还要求终结符不会出现在消息的其他地方.

对于#2,如果可能不同步,我可以添加终结符,或者我保证永远不会失去同步,只要发送方程序正确无误即可!是否有必要做#2 #3?

请告诉我.

谢谢,jbu

Mar*_*pic 5

您正在使用TCP,数据包传输是可靠的.所以连接要么掉线,要么超时,否则你会读完整个信息.因此选项#2没问题.


Dav*_*ary 5

我同意 sigjuice。如果您有一个大小字段,则没有必要添加和结束消息分隔符——但是,这是一个好主意。两者都使事情变得更加健壮和更容易调试。

考虑使用标准的netstring 格式,它包括一个大小字段和一个字符串结尾字符。因为它有一个 size 字段,所以可以在消息中使用字符串结束字符。