国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# Socket粘包處理講解示例

2020-01-24 03:01:49
字體:
供稿:網(wǎng)友

當(dāng)socket接收到數(shù)據(jù)后,會(huì)根據(jù)buffer的大小一點(diǎn)一點(diǎn)的接收數(shù)據(jù),比如:

對(duì)方發(fā)來了1M的數(shù)據(jù)量過來,但是,本地的buffer只有1024字節(jié),那就代表socket需要重復(fù)很多次才能真正收完這邏輯上的一整個(gè)消息。
對(duì)方發(fā)來了5條2個(gè)字符的消息,本地的buffer(大小1024字節(jié))會(huì)將這5條消息全部收入囊下...
那么,如何處理呢?下面我以最簡(jiǎn)單的一種文本消息來demo

根據(jù)上面所描述的情況,最重要的關(guān)鍵落在了下面3個(gè)因素的處理上

消息的結(jié)尾標(biāo)記
接收消息時(shí)判斷結(jié)尾標(biāo)記
當(dāng)本次buffer中沒有結(jié)尾標(biāo)記時(shí)怎么處理
我把寫好的核心算法貼出來:

復(fù)制代碼 代碼如下:

StringBuilder sb = new StringBuilder();             //這個(gè)是用來保存:接收到了的,但是還沒有結(jié)束的消息
        public void ReceiveMessage(object state)            //這個(gè)函數(shù)會(huì)被以線程方式運(yùn)行
        {
            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;   //這個(gè)是指消息結(jié)束符的長度,此處為/r/n
                for(int i=0;i<rawMsg.Length;)               //遍歷接收到的整個(gè)buffer文本
                {
                    if (i <= rawMsg.Length - rnFixLength)
                    {
                        if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息結(jié)束符,則加入sb
                        {
                            sb.Append(rawMsg[i]);
                            i++;
                        }
                        else
                        {
                            this.OnNewMessageReceived(sb.ToString());//找到了消息結(jié)束符,觸發(fā)消息接收完成事件
                            sb.Clear();
                            i += rnFixLength;
                        }  
                    }
                    else
                    {
                        sb.Append(rawMsg[i]);
                        i++;
                    }
                }
            }
        }

這個(gè)組件的使用方法:

復(fù)制代碼 代碼如下:

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);
        }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 迁安市| 措勤县| 贡山| 新龙县| 札达县| 马尔康县| 太谷县| 富源县| 留坝县| 娱乐| 阿拉善右旗| 鄂尔多斯市| 华容县| 东辽县| 佳木斯市| 宁国市| 广平县| 包头市| 黄龙县| 饶阳县| 苍山县| 巴彦县| 十堰市| 德江县| 杂多县| 柏乡县| 若羌县| 乌鲁木齐市| 红安县| 浦城县| 沅陵县| 佳木斯市| 尚志市| 治多县| 辉南县| 保靖县| 怀宁县| 永宁县| 新龙县| 盐城市| 麻阳|