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