Zinx学习之消息封装模块
目录
警告
本文最后更新于 2021-01-02,文中内容可能已过时。
封装消息接口
在之前我们的消息是在Request中作为data传递的,现在我们需要对消息进行细分,所以要抽象出一个消息接口
创建 ziface/imessage.go
,代码如下:
|
|
消息实体及初始化
这一块没有太多难度,直接贴代码了。
|
|
消息的封包与拆包
Zinx框架使用经典的 TLV(Type-Len-Value) 封包格式来解决TCP黏包问题。
TLV 即在head部分先存放数据长度,再存放数据ID,body部分存数据。这样在读消息时,先去head部分把数据长度读到,然后再把该数据向后偏移该数据长度就是整个数据,每个数据又用数据ID来区分。
关于TCP黏包 这里简单查了下资料,便于理解:当客户端调用两次send,服务端一次recv就全部读取出来,我们是希望怎么传就怎么读,保证数据的完整性。现象是这个样子,但是TCP本来就是基于字节流而不是消息包的协议,它自己说的清清楚楚:我会把你的数据变成字节流发到对面去,而且保证顺序不会乱,但是你要自己搞定字节流解析。所以这个问题其实就是“如何设计应用层协议的问题”。
创建 zinx/ziface/idatapack.go
文件,构造如下方法:
- 封包数据
- 拆包数据
- 得到头部长度
|
|
创建 zinx/znet/datapack.go
文件,实现IDataPack中的全部方法:
|
|
测试封包拆包
构建单元测试 zinx/znet/datapack_test.go
文件,代码如下:
|
|
测试结果如下: