TCP传输过程中的粘包拆包问题的解决

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.IO;

namespace EncodeTool{    

///

/// 关于编码的工具类

///

public static class EncodeTools    {      

  #region 粘包拆包问题 封装一个有规定的数据包        

///

/// 构造包体: 包头 + 包尾

//////

public static byte[] EncodePacket(byte[] data)        

{            // 内存流对象            

using (MemoryStream ms = new MemoryStream())           

 {                

       using (BinaryWriter bw = new BinaryWriter(ms))               

         {                    //先写入长度                   

                  bw.Write(data.Length);                    

                   //再写入数据                   

                   bw.Write(data);                  

                byte[] byteArray = new byte[(int)ms.Length];                    

              Buffer.BlockCopy(ms.GetBuffer(),0,byteArray,0,(int)ms.Length);                   

                return byteArray;              

  }         

   }     

   }       

 ////// 解析包体,从缓存里取出一个一个完整的数据包

/// 这里的形参dataCache引用的是客户端里定义的服务端发送的数据缓存区,在这里修改直接改变其数值

//////

public static byte[] DecodePacket(ref ListdataCache)

{

// 四个字节构成一个int长度  <4不能构成一个完整的消息

if (dataCache.Count < 4)

throw new Exception("数据缓存长度不足4 不能构成一个完整的消息");

using (MemoryStream ms = new MemoryStream())

{

using (BinaryReader br = new BinaryReader(ms))

{

int length = br.ReadInt32();

// 剩余的长度

int dataReminLength = (int)(ms.Length - ms.Position);

if (length > dataReminLength)

throw new Exception("数据长度不够包头约定的长度, 不能构成一个完整的消息");

byte[] data = br.ReadBytes(length);

//更新一下数据缓存

dataCache.Clear();

dataCache.AddRange(br.ReadBytes(dataReminLength));

return data;

}

}

}

#endregion

}

}

你可能感兴趣的:(TCP传输过程中的粘包拆包问题的解决)