TCP客户端逐字节发送数据。那么,如何告诉服务器此消息已经结束并且新消息现在开始了?
一种方法是修复一个特殊字符,它将作为书签发送,但该字符也可能是导致混淆的消息的一部分。
还有其他最佳出路吗?
答案 0 :(得分:1)
一种可能的方法是,在发送实际消息之前,您可以发送特定消息中的字节数。当接收方已收到该字节数时,它可以开始接收下一条消息
答案 1 :(得分:1)
如果您希望将字符用作消息标记的结尾或作为消息的一部分,则需要使用转义序列。
例如:使用字符“$”结束消息,使用“%”转义
即
%$ -> $
%% -> %
然后使用'$'结束消息
所有或者发送消息开始时要接收的字节数(如果你不知道那一点完整消息的长度,则发送消息块)。
答案 2 :(得分:1)
如果消息是二进制,则无法使用特殊字符进行分隔编码。标签长度值(TLV)编码最适合此。
例如
+--------+----------+----------------+
| Tag | Length | Content |
| 0x0001 | 0x000C | "HELLO, WORLD" |
+--------+----------+----------------+
除此之外,您还可以拥有多种消息类型
答案 3 :(得分:1)
查看开源通信框架networkComms.net中使用的实现。特别是第892行的{InmpackPacketHandleHandOff()here。
它保证收到的第一个字节指定数据包标头的大小(小于255个字节)。一旦接收到足够的字节以重建报头,就可以检查报头以确定要接收的剩余大小(数据部分)。如果传入的字节数多于预期的标题和数据部分,则查看第一个字节并重新开始。
使用带书签的字符是在网络堆栈的基础级别使用的,但必须小心实施,以避免进一步的复杂化。