0003-异步编程粘包
2019-04-18 本文已影响0人
HeavenOrSky
针对于上一篇文章中,加入客户端一次性发送大量的数据,那么有些信息就会粘包就会发生。
客户端代码发送消息代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASYNClient
{
class Program
{
static void Main(string[] args)
{
Client client = new Client();
//等待客户端连接服务器后我们按下回车键模拟客户端一次性发送多条数据
Console.ReadLine();
int index = 100;
for (int i = 0; i < 15; i++)
{
index++;
string message = index.ToString();
byte[] data = Encoding.UTF8.GetBytes(message);
client.SendData(data);
}
Console.ReadLine();
}
}
}


从以上的结果来看我们一共发送了15条数据,第一次测试服务器接收到了4次数据,第2次接受的数据一共粘了11条数据,第4次粘了2条数据;第二次测试服务器接受到了6次数据,第2次接受的数据粘了4条数据,第4次接收的数据粘了5条数据,第5次接收的数据粘了3条数据。虽然发生了粘包但是所有数据都是按照顺序到达的服务器,这是说明了TCP协议的可靠性,没有任何的数据丢失。并且每次接收的数据都是按客户端的一条信息为单位的。没有出现客户端的一条数据分两次到达服务器的。


我们两次测试,还是同样的规律。我将服务器的缓冲区改小将8096设置为512
byte[] buffer = new byte[512];
并且将发送的消息设置为了朱自清的《匆匆》内容。我们看到了一条消息分成了4次发送

但是在第1次和第2次,第2次和第3次收消息的时候出现了乱码,将","和"去"分成了两次发送没有正确解析外,其他的信息还是正确发送了,并且顺序没有发生改变。