a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

C# Socket粘包處理講解示例

2020-01-24 03:01:49
字體:
來源:轉載
供稿:網友

當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;   //這個是指消息結束符的長度,此處為/r/n
                for(int i=0;i<rawMsg.Length;)               //遍歷接收到的整個buffer文本
                {
                    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);
        }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玩色男孩 | 日本xxww视频免费 | 8×8x拔擦拔擦在线视频网站 | 国产精品不卡视频 | 欧美一区二区三区四区不卡 | 欧美日韩午夜 | 91麻豆精品国产91久久久资源速度 | 91精品动漫在线观看 | 久在线| 国变精品美女久久久久av爽 | 一区二区三区日韩 | 一区二区国产精品 | 狠狠色噜噜狠狠狠狠 | 亚洲天堂免费在线视频 | 国产精品无码专区在线观看 | 日韩一区二区免费视频 | 色鲁97精品国产亚洲 | 欧美午夜理伦三级在线观看 | 国产精品久久久久影院色老大 | 欧美国产在线观看 | 二区在线视频 | 亚洲国产免费看 | 欧美日韩国产一区二区三区不卡 | 日韩国产综合 | 欧美日韩精品一区二区 | 午夜激情影院 | 亚洲高清一二三区 | 大陆一级毛片免费视频观看 | 精品毛片在线 | 国产精品视频网 | 日韩精品一区二区三区中文在线 | 亚洲国产精品麻豆 | www.久久 | 四虎视频在线精品免费网址 | 成人免费高清 | 黄18网站| 91精品中文字幕一区二区三区 | 国产精品成人3p一区二区三区 | 国产一区免费在线观看 | a免费观看 | 亚洲精品在线播放视频 |