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


从客户端接收到的数据:
77777777777777777777777777777777777777777777777777777777790909090909090909090909090909090909090000000000000000000000000099
(可以看出服务器是分两次接收的,但其实只要static byte[] dataBuffer = new byte[1024];给的空间足够大,分包问题就可解决)
其实也很好解决,我们在发送数据的时候事先存储数据的长度 , 不过用来存储数据长度的内存大小需要指定好,否则就没法判断了 。
假设我们现在的数据出现了粘包 , 如下图所示:
这里只是演示一下,如果只有连续发送4次数据,一般是不会出现粘包的,看上图橙色部分表示我们用一个int32类型储存数据的长度 , 蓝色部分为我们实际要发送的数据,现在发生了粘包,也就是这四条数据合在一起发送给了服务器,
此时这条数据的总大小为 4字节 * 4 + 5 + 7 + 10 + 4 = 42字节
我们通过读取4字节数据可以知道数据的实际长度,以第一个数据为例,我们读取4字节数据 , 知道了这个数据有5个字节,程序如下:
int data_length = BitConverter.ToInt32(_data, 0);
此时的data_length = 5;此时我们就读取这5个字节的数据即可!
string s = Encoding.UTF8.GetString(_data, 4, 5);
然后我们截取数据,从源数据的第4 + 5的位置开始截取到一个新数组,新字节数组索引从零开始 , 此时新字节数据的长度为42 - (5 + 4);(下图为新字节数组)
Array.Copy(_data, 5 + 4, _data, 0, 42 - (5 + 4));
依次循环下去,粘包就被成功的分包了 。当然这个不要忘记每次更新一下当前数据长度 。
_curLength = _curLength - (data_length + 4); // _curLength = 42 - (5 + 4)
1、客户端
创建Message类,用于发送数据前做处理,使得首4字节储存数据长度 。
Message:
Main:
2、服务端
创建Message类,解决粘包问题!
Main:
服务器查看调试信息:
服务器已启动......
有一个客户端进行连接成功......
解析到一条数据:0米
4
8
解析到一条数据:1米
4
630
解析到一条数据:2米
4
622
解析到一条数据:3米
4
614
解析到一条数据:4米
4
606
解析到一条数据:5米
4
598
解析到一条数据:6米
4
590
解析到一条数据:7米
4
582
解析到一条数据:8米
4
574
解析到一条数据:9米
4
566
解析到一条数据:10米
5
558
..............................................................................
解析到一条数据:98米
5
18
解析到一条数据:99米
5
9
有客户端退出.....
你解决个屁,异步接收的情况下,把_data数组调大点就完了,傻逼,咱们是做游戏!一般不会有分包问题?。?
go语言粘包解决方案的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言dll、go语言粘包解决方案的信息别忘了在本站进行查找喔 。

推荐阅读