使用TCP协议进行网络游戏开发的时候,有粘包和分包两个问题。
粘包和分包是利用Socket在TCP协议下内部的优化机制,在使用TCP协议进行数据的传输进行通讯的时候,会出现粘包分包问题的话,是由于优化导致,即内部的数据传输机制所导致的。
在客户端调用Send()方法传送数据,每传送的数据称为包
当发送数据比较频繁的时候,且数据的内容较短。不会立马发送服务器,会包包结合进行打包,服务器收到多条消息但是只调用一次。服务器接收到的消息不一定是一条消息,可能是多条消息的整合。
// 向服务端发送100条数据 for (int i = 0; i < 100; i++) { clientSocket.Send(Encoding.UTF8.GetBytes(i.ToString())); }实际客户端发送100次数据。会看到服务端只从客户端只接收了1次数据。 再次测试发现发送的100次数据,服务端只接受了3次。所以服务器粘包也是不固定的,他与运行的快慢有关 。 不管粘包多少条数据,从客户端发送来的数据的顺序是不会改变的。
与粘包相似,发送特别大的数据量,可能进行分包发送。分成多条消息发送给服务器。包大占用网速时间都比较长。一个包被分为10次,服务器会接收10次。
分包问题不在于发送有多快,而在于发送的数据有多大。如图客户端发送一条大的数据,服务器接收两次。 同步接受即使接收数组足够大,数据太大也会进行分包,异步的方式数组太大不会产生分包。接收的数组在做网络游戏时,由于服务器每条接收的消息仅包含位置信息等小数据,设置1024就可以。
所以每一次读到消息的时候需要知道,一次接收里面包含多少条消息,然后再进行处理。
关于上图中的乱码,服务器收到的第二条消息的时候前面有两个字符是乱码,这是因为汉字字符的关系,因为我这里测试的数据用的是汉字,由于汉字不可拆分这才造成乱码,但不影响后面的数据处理,只要保证时序的重要性就可以了。