gtcp
提供了许多方便的原生操作连接数据的方法,但是在绝大多数的应用场景中,开发者需要自己设计数据结构,并进行封包/解包处理,由于 TCP
消息协议是没有消息边界保护的,因此复杂的网络通信环境中很容易出现 粘包 的情况。因此 gtcp
也提供了简单的数据协议,方便开发者进行消息包交互,开发者不再需要担心消息包的处理细节,包括封包/解包处理,这一切复杂的逻辑 gtcp
已经帮你处理好了。
简单协议
gtcp
模块提供了简单轻量级数据交互协议,效率非常高,协议格式如下:
数据长度(16bit)|数据字段(变长)
- 数据长度:默认为
16位
(2字节
),用于标识该消息体的数据长度,单位为字节,不包含自身的2字节; - 数据字段:变长,根据数据长度可以知道,数据最大长度不能超过
0xFFFF = 65535 bytes = 64 KB
;
简单协议由 gtcp
封装实现,如果开发者客户端和服务端如果都使用 gtcp
模块来通信则无需关心协议实现,专注 数据
字段封装/解析实现即可。如果涉及和其他开发语言对接,则需要按照该协议实现对接即可,由于简单协议非常简单轻量级,因此对接成本很低。
提示
数据字段也可以为空,即没有任何长度。
操作方法
https://pkg.go.dev/github.com/gogf/gf/v2/net/gtcp
type Conn
func (c *Conn) SendPkg(data []byte, option ...PkgOption) error
func (c *Conn) SendPkgWithTimeout(data []byte, timeout time.Duration, option ...PkgOption) error
func (c *Conn) SendRecvPkg(data []byte, option ...PkgOption) ([]byte, error)
func (c *Conn) SendRecvPkgWithTimeout(data []byte, timeout time.Duration, option ...PkgOption) ([]byte, error)
func (c *Conn) RecvPkg(option ...PkgOption) (result []byte, err error)
func (c *Conn) RecvPkgWithTimeout(timeout time.Duration, option ...PkgOption) ([]byte, error)
可以看到,消息包方法命名是在原有的基本连接操作方法中加上了 Pkg
关键词便于区分。
其中,请求参数中的 PkgOption
数据结构如下,用于定义消息包接收策略:
// 数据读取选项
type PkgOption struct {
HeaderSize int // 自定义头大小(默认为2字节,最大不能超过4字节)
MaxDataSize int // (byte)数据读取的最大包大小,默认最大不能超过2字节(65535 byte)
Retry Retry // 失败重试策略
}