最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Socket粘包處理講解示例

 更新時間:2013年12月05日 09:51:26   作者:  
這篇文章主要介紹了C# Socket粘包處理講解,大家可以參考使用

當socket接收到數據后,會根據buffer的大小一點一點的接收數據,比如:

對方發(fā)來了1M的數據量過來,但是,本地的buffer只有1024字節(jié),那就代表socket需要重復很多次才能真正收完這邏輯上的一整個消息。
對方發(fā)來了5條2個字符的消息,本地的buffer(大小1024字節(jié))會將這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());//找到了消息結束符,觸發(fā)消息接收完成事件
                            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);
        }

相關文章

  • C#數值轉換-隱式數值轉換表參考

    C#數值轉換-隱式數值轉換表參考

    隱式轉換就是直接使用,比如可以把一個 byte 類型直接用在 int 上
    2013-04-04
  • 圖文介紹c#封裝方法

    圖文介紹c#封裝方法

    在本篇內容里小編給大家分享的是關于c#使用封裝方法以及相關知識點,對此有需要的朋友們可以學習下。
    2018-12-12
  • C#調用7z實現(xiàn)文件的壓縮與解壓

    C#調用7z實現(xiàn)文件的壓縮與解壓

    這篇文章主要介紹了C#調用7z實現(xiàn)文件的壓縮與解壓,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • 詳解C#中==、Equals、ReferenceEquals的區(qū)別

    詳解C#中==、Equals、ReferenceEquals的區(qū)別

    C#中Equals , == , ReferenceEquals都可以用于判斷兩個對象的個體是不是相等,本篇文章詳解C#中Equals , == , ReferenceEquals都可以用于判斷兩個對象的個體是不是相等,有興趣的可以了解一下。
    2016-12-12
  • C#實現(xiàn)Menu和ContextMenu自定義風格及contextMenu自定義

    C#實現(xiàn)Menu和ContextMenu自定義風格及contextMenu自定義

    ContextMenu 類表示當用戶在控件或窗體的特定區(qū)域上單擊鼠標右鍵時會顯示的快捷菜單,要想實現(xiàn)自定義的Menu和ContextMenu效果,大家可以通過派生ProfessionalColorTable類,下面小編把實現(xiàn)Menu和ContextMenu自定義風格及ContextMenu自定義給大家整理一下
    2015-08-08
  • 使用C#?11的靜態(tài)接口方法改進?面向約定?的設計方法

    使用C#?11的靜態(tài)接口方法改進?面向約定?的設計方法

    我們知道接口是針對契約的定義,但是一直以來它只能定義一組“實例”的契約,而不能定義類型的契約,因為定義在接口中的方法只能是實例方,這篇文章主要介紹了使用C#?11的靜態(tài)接口方法改進面向約定?的設計,需要的朋友可以參考下
    2022-12-12
  • C#多線程傳遞參數及任務用法示例

    C#多線程傳遞參數及任務用法示例

    這篇文章主要介紹了C#多線程傳遞參數及任務用法,結合簡單實例形式分析了C#多線程的使用及相關的參數傳遞與任務創(chuàng)建等使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#異步執(zhí)行任務的方法

    C#異步執(zhí)行任務的方法

    這篇文章主要介紹了C#異步執(zhí)行任務的方法,以一個簡單實例形式分析了C#異步執(zhí)行的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#制作網站掛機程序的實現(xiàn)示例

    C#制作網站掛機程序的實現(xiàn)示例

    本文主要介紹了C#制作網站掛機程序,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#實現(xiàn)利用Windows API讀寫INI文件的方法

    C#實現(xiàn)利用Windows API讀寫INI文件的方法

    這篇文章主要介紹了C#實現(xiàn)利用Windows API讀寫INI文件的方法,涉及C#針對ini文件的創(chuàng)建、讀取及寫入等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

赤峰市| 大悟县| 中超| 太白县| 万盛区| 屏南县| 榆社县| 巫山县| 仁寿县| 鹤岗市| 栖霞市| 潼关县| 桂东县| 阿克苏市| 江达县| 塔河县| 山西省| 礼泉县| 宁强县| 库尔勒市| 江永县| 新野县| 壶关县| 象山县| 隆化县| 喀喇| 霍林郭勒市| 新丰县| 习水县| 大理市| 基隆市| 察雅县| 广德县| 霍林郭勒市| 昌乐县| 聂拉木县| 澳门| 全椒县| 集安市| 岐山县| 玉屏|