固定包头数据处理适配器
一、说明
固定包头数据处理适配器是处理粘包、分包问题的最有力、最可靠、最高效、最稳定的一种方案,它基本上适用于所有场景。即使跨语言使用,也只需要在其他语言中设计相同算法就可以。
二、特点
- 最有力的解决粘包。分包问题。
- 是自定义协议的不二选择。
- 支持指定包头长度,Byte、Ushort、Int三种类型作为包头。
- 最好在客户端与服务器均使用TouchSocket组件时使用。不然就需要非TouchSocket的一方适配包头算法。
三、协议算法
- Byte包头算法:以第一个字节作为后续整个数据的长度,整个数据长度区间为[0,255]。
- Ushort包头算法:前2个字节,且为默认端序(小端)的排列,作为后续整个数据的长度,整个数据长度区间为[0,65535]。
- Int包头算法(默认配置):前4个字节,且为默认端序(小端)排列,作为后续整个数据的长度,整个数据长度区间为[0,2^31]。
四、使用
客户端与服务器均适用。下列以服务器为例。
步骤
- TouchSocketConfig配置中设置(可以同时指定HeaderType等属性)
- 通过Received(事件、方法、插件)中的ByteBlock读取数据。
TcpService service = new TcpService();
service.Received += (client, byteBlock, requestInfo) =>
{
//从客户端收到信息
string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
};
service.Setup(new TouchSocketConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost(7790) })
.SetDataHandlingAdapter(() => { return new FixedHeaderPackageAdapter() { FixedHeaderType= FixedHeaderType.Int }; }))//配置适配器
.Start();//启动
注意
该适配器,在发送(Send、SendAsync)数据时,会自动封装数据头,所以不需要手动封装。如果想要发送手动组装的数据,请使用DefaultSend。
注意
接收的数据长度是byteBlock.Len,而 不是byteBlock.Buffer.Length。
提示
该适配器,客户端与服务器均适用。
五、可设置参数
属性 | 描述 | 默认值 |
---|---|---|
MaxPackageSize | 适配器能接收的最大数据包长度 | 1024*1024*1024字节 |
CanSendRequestInfo | 是否允许发送IRequestInfo对象 | false |
CanSplicingSend | 拼接发送 | false |
CacheTimeoutEnable | 是否启用缓存超时。 | true |
CacheTimeout | 缓存超时时间。 | 1秒 |
UpdateCacheTimeWhenRev | 是否在收到数据时,即刷新缓存时间。当设为true时,将弱化CacheTimeout的作用,只要一直有数据,则缓存不会过期。当设为false时,则在CacheTimeout的时效内。必须完成单个缓存的数据 | true |