说明
TCP是流性质数据的发送与接收,就像是一条河流,我们不能依靠它本身来区分哪部分水来自哪条山沟。但是往往,数据的解析就必须清楚的知道哪里是解析界限,不然发送的数据则像臭婆娘的烂线裤,难以把握。
实际上,在TouchSocket中已经基本解决了粘包、分包问题,我们把这个扩展类叫做数据处理适配器(DataHandlingAdapter),不难发现在TouchSocket框架中,TcpClient
和SocketClient
均包含此属性,所以只需要指定不同类型
,不同参数
的数据处理适配器,就可以轻松解决粘包、分包问题。
思路
一般的,解决粘包、分包问题的思路有三种,分别为:固定包头
、固定长度
、终止因子分割
。
在TouchSocket框架中共预设有四种数据处理适配器,分别为:
正常数据处理适配器(NormalDataHandlingAdapter)
固定包头数据处理适配器(FixedHeaderPackageAdapter)
固定长度数据处理适配器(FixedSizePackageAdapter)
终止因子分割数据处理适配器(TerminatorPackageAdapter)
(1)正常数据处理适配器(
正常数据处理适配器就是处理普通的TCP报文,内部不进行任何数据处理,这也就意味着它并不能解决粘、分包的问题,它只是能够将数据进行接收和处理而已。NormalDataHandlingAdapter
)
特点:
-
(2)固定包头数据处理适配器(
FixedHeaderPackageAdapter
)固定包头数据处理适配器是处理粘包、分包问题的最有力、最可靠、最高效、最稳定的一种方案,它基本上适用于所有场景。即使跨语言使用,也只需要在其他语言中设计相同算法就可以。
特点: 最有力的解决粘包。分包问题。
- 在RRQMSocket框架中是不二选择。
支持指定包头长度,Byte、UShort、Int三种类型作为包头。
(3)固定长度数据处理适配器(
FixedSizePackageAdapter
)固定长度数据处理适配器是将发送的数据通过分割、填补的操作,以达到每次发送的数据都是固定的长度来处理粘包、分包问题。这种方案的使用场景比较少,所以在这里不做过多介绍。
特点:算法简单,可以比较轻松的实现跨语言、跨框架。
-
(4)终止因子分割数据处理适配器(
TerminatorPackageAdapter
)终止因子分割数据处理适配器是通过特殊字符或数值的方式,来达到处理粘包、分包的目的。可随意设置分割因子的值,以及编码方式。不仅如此,还有异常数据设置,在达到设定值时,如果还没有发现分割因子,则抛弃数据。其稳定性仅次于固定包头,且使用场景也比较广泛。
特点: 算法简单,非常容易实现跨语言、跨框架。
- 发送普通流数据时,有很小的概率发生提前终止的情况(可设置复杂终止因子来解决)。