内置包适配器
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
内置包适配器,是框架内置的,用于解决粘、分包问题的现成适配器。它能一键式解决粘、分包问题。目前内置的包适配器有:
适配器 | 名称 | 功能特点 |
---|---|---|
FixedHeaderPackageAdapter | 固定包头数据处理适配器 | 固定包头数据处理适配器是处理粘包、分包问题的最有力、最可靠、最高效、最稳定的一种方案,它基本上适用于所有场景。即使跨语言使用,也只需要在其他语言中设计相同算法就可以。 |
FixedSizePackageAdapter | 固定长度数据处理适配器 | 固定长度数据处理适配器是将发送的数据通过分割、填补的操作,以达到每次发送、接收的数据都是固定的长度来处理粘包、分包问题。这种方案一般适用于机械臂,机器人控制等场景。 |
TerminatorPackageAdapter | 终止因子数据处理适配器 | 终止因子数据处理适配器是通过特殊字符或数值的方式,来达到处理粘包、分包的目的。可随意设置分割因子的值,以及编码方式。不仅如此,还有异常数据设置,在达到设定值时,如果还没有发现分割因子,则抛弃数据。其稳定性仅次于固定包头,且使用场景也比较广泛。 |
PeriodPackageAdapter | 周期数据处理适配器 | 周期数据处理适配器是通过时间周期的方式,来处理分包的目的(不包括粘包)。可处理任意数据。但是这也只是一定程度的处理。 |
二、特点
2.1 固定包头数据处理适配器
- 最有力的解决粘包。分包问题。
- 是自定义协议的不二选择。
- 支持指定包头长度,Byte、Ushort、Int三种类型作为包头。
- 最好在客户端与服务器均使用TouchSocket组件时使用。不然就需要非TouchSocket的一方适配包头算法。
2.2 固定长度数据处理适配器
- 无论何时,发送与接收的数据长度永远为设定值。
- 算法简单,可以比较轻松的实现跨语言、跨框架。
- 一般适用于业务数据固定场景,
2.3 终止因子数据处理适配器
- 最适用于字符串类(Json,Xml等)的信息交互。
- 算法简单,非常容易实现跨语言、跨框架。
- 发送普通流数据时,有很小的概率发生提前终止的情况(可设置复杂终止因子来解决)。
2.4 周期数据处理适配器
- 可处理任意数据。
- 只能解决分包问题,无法解决粘包问题。
- 处理效率会有一定延迟。
三、算法解释
3.1 固定包头算法
- Byte包头算法:以第一个字节作为后续整个数据的长度,整个数据长度区间为[0,255]。
- Ushort包头算法:前2个字节,且为默 认端序(小端)的排列,作为后续整个数据的长度,整个数据长度区间为[0,65535]。
- Int包头算法(默认配置):前4个字节,且为默认端序(小端)排列,作为后续整个数据的长度,整个数据长度区间为[0,2^31]。
3.2 固定长度数据处理算法
固定长度数据处理算法比较简单,就是事先约定发送数据的长度无论何时都是一致的。
3.3 终止因子分割数据算法
终止因子分割数据算法,就是通过事先约定,发送的数据是以特定数据的组合作为结束的。例如:redis协议,就是以\r\n作为结束。不过值得注意的是,框架内置的不仅可以用字符串作为终止字符,还能以16进制甚至二进制作为终止字符。
3.4 周期数据算法
周期数据处理适配器,就是通过判断收到数据的时间间隔,将极短时间内收到的数据进行合并。能够一定程度的解决分包问题。