1. 特定字符或字符串
使用一些不会在正常消息内容中出现的特殊字符或字符串作为消息的分隔符。例如:
行分隔符:在类似于
HTTP
头部的文本协议中,可以使用换行符(如\r\n
)作为每一行的结束标记。特殊字符串:可以选择一串特殊的字符序列,如
"<EOF>"
,作为消息的结束标志。在`HTTP`协议中,用一个空行(即连续的`\r\n\r\n`)分隔头部和内容。
这种方法简单但依赖于数据内容不包含分隔符,因此不适用于二进制数据或任何可能包含这些特殊字符的数据。
2. 固定消息头 + 消息体结果(TCP)
这种结构中⼀般消息头部分是⼀个固定字节长度的结构,并且消息头中会有⼀个特定的字段指定消息体的大小。收消息时,先接收固定字节数的头部,解出这个消息完整长度,按此长度接收消息体。这是目前各种网络应用用的最多的⼀种消息格式;header + body
3. 结构化分隔
在一些协议中,消息可以按照结构化格式进行分割,每个字段都有明确的开始和结束。例如:
- JSON对象:使用
{}
括起来的结构作为一个完整的消息单位。 - XML文档:通过XML的开始标签和结束标签定义消息的边界。
这种方法适用于数据格式固定且可预解析的情况。
4. 结束符分隔,头部存储长度
在序列化后的buffer前面增加⼀个字符流的头部,其中有个字段存储消息总长度,根据特殊字符(比如根据\n或者\0)判断头部的完整性。这样通常比2要麻烦⼀些,HTTP
和Redis
采用的是这种方式。收消息的时候,先判断已收到的数据中是否包含结束符,收到结束符后解析消息头,解出这个消息完整长度,按此长度接收消息体。
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB