初始代码来源 :https://blog.csdn.net/weixin_44003309 我的另外一篇:Socket_TCP协议的同步与异步调用
粘包:传输数据时 数据过小或数据传输过快时,将多个信息粘在一起传输
分包:传输的数据过大时,可能会拆分成多个进行传输
粘包演示:
在客户端代码中将发送消息的代码改为用for循环发送100条消息给服务器:
//发送消息
//while (true)
//{
// string str = Console.ReadLine();
// if (str == "c")
// {
// tcpSocket.Close();
// return;
// }
// byte[] data = Encoding.UTF8.GetBytes(str);
// tcpSocket.Send(data);
//}
for (int i = 0; i < 100; i++)
{
tcpSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));
}
分包:一次性传输较大的数据
如下图,会分成好几份分别发送:
解决方案:在每次传输的数据前加上数据长度,假设添加的数据长度为40时,后面的长度若不为40,则不处理,等待下一次传输,在判断是否满足40个,满足后再处理消息。即可一条一条的处理消息
将数据长度固定的存储,使用int32,固定为4个字节
每次接收到数据时,先取得前四个字节,再转化为一个长度,按这个长度往后读取
在客户端发送数据的时候加上数据长度 :
在客户端中添加一个新的Message类:
using System;
using System.Collections.Generic;
usi