首页 新闻 会员 周边 捐助

C# 关于SOCKet的粘包问题

0
悬赏园豆:40 [已解决问题] 解决于 2018-10-24 15:26

服务端给客户端连续发了几条消息,客户端接收一条就处理一条消息。 可是都是处理了这条消息才会去接收下一条消息 ,这样就出现了粘包问题 ,我看了下资料 , 试过的方法需要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);
                 
                
            }

        }

    }
Anlien-Bei的主页 Anlien-Bei | 初学一级 | 园豆:48
提问于:2018-09-15 16:42
< >
分享
最佳答案
0

不是framework 2.0以上的问题。只要是socket 都会出现 粘包 并包 以及丢包的问题(其他语言也一样)。
解决办法 只能用协议来解决问题。

大概的思路是:客户端发送信息格式 头+长度+内容+校验(比如异或校验)+尾部
服务端接受的时候:同样安 头+长度+内容+校验(比如异或校验)+尾部的格式来解析 。取出内容。
如果不是:一般处理的办法:把当前的包 存在集合里面,下次发送过来的 放到集合 在解析。有的公司直接丢弃。要求对方重发。 代码方面自己去网上找吧。

收获园豆:40
s_p | 初学一级 |园豆:140 | 2018-09-17 08:27

谢谢你哦 。 最后就是这样的解决的

Anlien-Bei | 园豆:48 (初学一级) | 2018-09-17 08:36
其他回答(1)
0

随便给你个例子自己去看看怎么写通讯,写写玩仅仅显示你这么写没什么,大不了重复帧。
https://wenku.baidu.com/view/66a23d7c1fb91a37f111f18583d049649b660ea1.html
还没自己细写就搞些自己都没搞清楚的名词是不对的,该文档是个通讯的标准,你看看格式,看懂了就明白了。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-09-15 19:56

额 这是自己写的,然后根据需求改了 ,刚入门可能不是很熟悉 ,谢谢你

支持(0) 反对(0) Anlien-Bei | 园豆:48 (初学一级) | 2018-09-17 08:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册