C# TCP通信自定義包頭


winform經常用到TCP通信,使用TCP通信協議的好處大家都知道,數據傳送可靠,不會丟失,也就是不會丟包。但是使用TCP協議接收數據比有點麻煩,數據會粘包。為了保證數據正常的解析,這里使用最大眾的解決方法,在發送的數據包前面定義一個2個字節長度的包頭,根據包頭可以知道后續數據的長度。具體做法是發送端發送數據時同時將數據長度寫到包頭,接收端默認讀取兩個字節,有數據來它便讀到了數據包的長度,接着通過數據包的長度繼續讀取后續的數據。這樣就可以解決數據的粘包問題了。

發送端

          string msgs="aaa";
         byte[] msg = Encoding.Default.GetBytes(msgs);           
                int length = msg.Length;
                short lengthall = (short)(length + 2);
                byte[] lengthByte =  System.BitConverter.GetBytes(lengthall);//short轉字節調換位置
                byte tmp = lengthByte[0];
                lengthByte[0] = lengthByte[1];
                lengthByte[1] = tmp;
byte[] all = lengthByte.Concat(msg).ToArray(); //然后將字節數組寫入網絡流 if (bw != null && tcpClient.Connected==true) { bw.Write(all); bw.Flush(); } else { this.Reconnect(); }

接收端

  while (true)
            {
                byte[] BytesLenth = null;
                byte[] BytesContent = null;
                if (br == null) continue;                
                    BytesLenth = br.ReadBytes(2);
                    //字節轉int調換位置
                    byte tmp = BytesLenth[0];
                    BytesLenth[0] = BytesLenth[1];
                    BytesLenth[1] = tmp;

                    int lenth = BitConverter.ToInt16(BytesLenth, 0);
                    BytesContent = br.ReadBytes(lenth - 2);
                    string conContent = Encoding.Default.GetString(BytesContent);              
            }

這里需要注意一個問題,貼的代碼中int轉字節或者字節轉int的時候都把字節數組中的兩個數據進行了對調,這個是特殊情況,在與C或者C++程序通信的時候必須這樣才能正常解析,估計是不同語言讀取字節數組的順序不一樣導致的。如果是C#編的客戶端程序之間通信,不需要這樣對調位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM