服务端给客户端连续发了几条消息,客户端接收一条就处理一条消息。 可是都是处理了这条消息才会去接收下一条消息 ,这样就出现了粘包问题 ,我看了下资料 , 试过的方法需要framework 2.0 以上的版本才支持的方法 , 其他的也看不懂,有没有大神愿意给个指点
代码如下:
/// <summary>
/// 接受服务端发来信息的方法
/// </summary>
string strRecMsg;
//定义一个委托
delegate void Advice(string ss);
private void RecMsg()
{
while (true) //持续监听服务端发来的消息
{
strRecMsg = null;
int length = 0;
byte[] buffer = new byte[SendBufferSize];
try
{
//将客户端套接字接收到的字节数组存入内存缓冲区, 并获取其长度
length = socketClient.Receive(buffer);
}
catch (SocketException ex)
{
txtMsg.AppendText("套接字异常消息:" + ex.Message + "\r\n");
txtMsg.AppendText("服务端已断开连接\r\n");
//启用定时监听
ContentServer();
break;
}
catch (Exception ex)
{
txtMsg.AppendText("系统异常消息: " + ex.Message + "\r\n");
break;
}
//将套接字获取到的字节数组转换为人可以看懂的字符串
strRecMsg = Encoding.UTF8.GetString(buffer, 0, length);
Thread.Sleep(500);
if (strRecMsg.Contains(name))
{
//将文本框输入的信息附加到txtMsg中 并显示 谁,什么时间,换行,发送了什么信息 再换行
txtMsg.AppendText("服务端在 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 给您发送了:\r\n" + strRecMsg + "\r\n");
Advice ad = WriteTxt;
IAsyncResult resule = ad.BeginInvoke(strRecMsg, null, null);
while (!resule.AsyncWaitHandle.WaitOne(-1, false))
{
}
ClientSendMsg(name + "客户端已处理", 0);
}
}
}
不是framework 2.0以上的问题。只要是socket 都会出现 粘包 并包 以及丢包的问题(其他语言也一样)。
解决办法 只能用协议来解决问题。
大概的思路是:客户端发送信息格式 头+长度+内容+校验(比如异或校验)+尾部
服务端接受的时候:同样安 头+长度+内容+校验(比如异或校验)+尾部的格式来解析 。取出内容。
如果不是:一般处理的办法:把当前的包 存在集合里面,下次发送过来的 放到集合 在解析。有的公司直接丢弃。要求对方重发。 代码方面自己去网上找吧。
谢谢你哦 。 最后就是这样的解决的
随便给你个例子自己去看看怎么写通讯,写写玩仅仅显示你这么写没什么,大不了重复帧。
https://wenku.baidu.com/view/66a23d7c1fb91a37f111f18583d049649b660ea1.html
还没自己细写就搞些自己都没搞清楚的名词是不对的,该文档是个通讯的标准,你看看格式,看懂了就明白了。
额 这是自己写的,然后根据需求改了 ,刚入门可能不是很熟悉 ,谢谢你