我们知道如果Socket传输数据太频繁并且数据量级比较大,就很容易出现分包(一个包的内容分成了两份)、粘包(前一个包的内容分成了两份,其中一份连着下一个包的内容)的情况。
粘包的处理方式有很多种,常见的三种是:
- 每个包都在头部增加一个当前传输包的int4字节大小作为包头。每次接收到数据先读取的包头,确定这一包的实际长度n,当接收够n+4长度的数据就是一个完整的包,再重复读取下一包的包头。(相对其它方式,编码复杂)
- 使用固定分隔符对每包进行分割。(轮询查询每个分隔符的位置,并且有可能分隔符与实际数据出现相同的情况)
- 发送方和接收方规定固定大小的缓冲区,也就是发送和接收都使用固定大小的 byte[] 数组长度,当字符长度不够时使用空字符弥补。(字符长度不够增加空字符使得传输数据增长)
推荐使用第一种方式。但是第一种方式编码相对复杂,所以下面结合第三方组件简单快速的实现第一种方式。
下面演示使用TouchSocket组件进行Socket传输。
客户端:
TouchSocket.Sockets.TcpClient tcpClient = new TouchSocket.Sockets.TcpClient();
tcpClient.Connecting = (client, e) =>
{
// 这里是指增加Int大小的包头
client.SetDataHandlingAdapter(new FixedHeaderPackageAdapter() { Fixed

文章讲述了Socket数据传输中可能出现的分包和粘包问题,介绍了三种处理方法,特别推荐使用带有包头的固定大小方式,并展示了如何使用TouchSocket组件实现这种方案。服务端和客户端的代码示例也详细展示了一次完整的连接过程。
最低0.47元/天 解锁文章
580

被折叠的 条评论
为什么被折叠?



