go语言粘包解决方案 go语言dll( 二 )


2、什么是分包
当我们发送的数据量很大的时候,可能是几千字节,TCP就会自动分开发送,其实说通俗点,就是你去拿快递 , 一看20个,一次拿不完,分几次拿!
3、总结
指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾 。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成 。
发送方引起的粘包是由TCP协议本身造成的 , TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据 。
若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据 。接收方引起的粘包是由于接收方用户进程不及时接收数据 , 从而导致粘包现象 。
这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走 , 则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据 。分包是指在出现粘包的时候我们的接收方要进行分包处理 。
在前面的测试程序中,是没有粘包问题的,这时候你可能有疑惑,我为啥数据会发送的特别快 , 我们以游戏服务器举例,比如游戏有联机对战功能,这时候肯定是需要同步位置信息的,这个频率是很快的 , 大约每秒就要40~80次,这个时候就会出现粘包问题 。
其实很简单只要简单修改一下客户端即可 。
1、程序测试 — 粘包问题
客户端:
服务器查看调试信息:
服务器已启动......
有一个客户端进行连接成功......
从客户端接收到的数据:0
从客户端接收到的数据:123
从客户端接收到的数据:4567
从客户端接收到的数据:8910
从客户端接收到的数据:1112131415
从客户端接收到的数据:161718
从客户端接收到的数据:192021222324
从客户端接收到的数据:25262728
从客户端接收到的数据:2930313233
从客户端接收到的数据:34353637
从客户端接收到的数据:38394041
从客户端接收到的数据:42434445
从客户端接收到的数据:46474849
从客户端接收到的数据:50515253
从客户端接收到的数据:5455565758
从客户端接收到的数据:59606162636465666768
从客户端接收到的数据:6970717273
从客户端接收到的数据:74757677
从客户端接收到的数据:78798081
从客户端接收到的数据:82838485
从客户端接收到的数据:86878889
从客户端接收到的数据:90919293
从客户端接收到的数据:9495969798
从客户端接收到的数据:99
(很明显数据没有发送100次)
1、程序测试 — 粘包问题
客户端:
服务器查看调试信息:
服务器已启动......
有一个客户端进行连接成功......
从客户端接收到的数据:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000撒大声地所多所多所多所多所多所多所多所多所多所000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000撒大声地所多所多所多所多所多所多所多所多所多所多所多所多所多所多撒大声地所 多所多所多所多所多所多所多所多所多所多所多所多所多所多撒大声地所多所多所多所多所多所多所多所多所多所多所多所多所多所多000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000----------------------------------------------------------------撒大声地所多所多所多所多所多所多所多所多所?

推荐阅读