C# Socket粘包处理讲解例子
当socket接收到数据后,会根据buffer的大小一点一点的接收数据,比如:
对方发来了1M的数据量过来,但是,本地的buffer只有1024字节,那就代表socket需要重复很多次才能真正收完这逻辑上的一整个消息。
对方发来了5条2个字符的消息,本地的buffer(大小1024字节)会将这5条消息全部收入囊下...
那么,如何处理呢?下面我以最简单的一种文本消息来demo
根据上面所描述的情况,最重要的关键落在了下面3个因素的处理上
消息的结尾标记
接收消息时判断结尾标记
当本次buffer中没有结尾标记时怎么处理
我把写好的核心算法贴出来:
StringBuilder sb = new StringBuilder(); //这个是用来保存:接收到了的,但是还没有结束的消息
public void ReceiveMessage(object state) //这个函数会被以线程方式运行
{
Socket socket = (Socket)state;
while(true)
{
byte[] buffer = new byte[receiveBufferSize]; //buffer大小,此处为1024
int receivedSize=socket.Receive(buffer);
string rawMsg=System.Text.Encoding.Default.GetString(buffer, 0, receivedSize);
int rnFixLength = terminateString.Length; //这个是指消息结束符的长度,此处为rn
for(int i=0;i
if (i <= rawMsg.Length - rnFixLength)
{
if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
{
sb.Append(rawMsg[i]);
i++;
}
else
{
this.OnNewMessageReceived(sb.ToString());//找到了消息结束符,触发消息接收完成事件
sb.Clear();
i += rnFixLength;
}
}
else
{
sb.Append(rawMsg[i]);
i++;
}
}
}
}
这个组件的使用方法:
A2DTcpClient client = new A2DTcpClient(127.0.0.1, 5000);
client.NewMessageReceived += new MessageReceived(client_NewMessageReceived);
client.Connect();
client.Send(HELLO);
client.Close();
static void client_NewMessageReceived(string msg)
{
Console.WriteLine(msg);
}
同类资源
- HP_Socket-5.8.6中文/英文模块/支持库
HP_Socket-5.8.6中文/英文模块/支持库本文件感兴趣的可以参考一下,由于易语言本身核心库的代码太老了一些...
- HP-Socket 5.5.1 rc2模块例程,新增了可靠UDP组件
易语言HP-Socket5.5.1rc2模块例程,新增了可靠UDP组件例子源代码,本次更新对UDP系列组件作了大量优化,新增了...
- 基于HPSOCKET软件开发c/s框架
易语言基于HPSOCKET软件开发c/s框架例子源代码,作为C/S模型软件开发者,总希望有一个相对完善的开发框架。...
- c#调用dll,dll加载epk
易语言c#调用dll,dll加载epk例子源代码,通过c#调用dll,易语言写dll调用epk。...
- C#版的模块中所有的api和相关的结构体的声明
C#版的模块中所有的api和相关的结构体的声明例子源代码,直接用易语言封装成dll调用。...
- 群控脚本框架,jsd+WebSocket全机型全分辨率免root免找图找色
易语言群控脚本框架,jsd+WebSocket全机型全分辨率免root免找图找色例子源代码,兼容安卓全机型全分辨率免ROO...
- 基于HPSocket一键搭建HTTP服务,支持POST、GET
易语言基于HPSocket一键搭建HTTP服务,支持POST、GET例子源代码,调用的模块源码也给出。...
- 基于HPSOCKET的C/S软件开发框架,功能全面
易语言基于HPSOCKET的C/S软件开发框架,功能全面例子源代码,这是对HPSocket稳定高效的最佳诠释。...
- 邮箱SMTP发信,支持SSL加密和普通Socket
邮箱SMTP发信,支持SSL加密和普通Socket例子源代码,未调用任何模块,实测暂无BUG。...
- c#版写的重命名工具
c#版写的重命名工具绿色版,之前记得有个跟这个界面类似的重命名,后来一直找不到了,下载转存太麻烦了就自己弄...
- HPsocket同步消息扩展
易语言HPsocket同步消息扩展例子源代码,tcp通讯如何做到同步应答,简单做了下。...
- C#开源利用OpenCV找图经典例子
C#开源利用OpenCV找图经典例子绿色版,没有使用最新本版是因为该本版.NET4.0就能跑。...