下载后可任意编辑Socket 开发之通讯协议及处理 在 Socket 应用开发中,还有一个话题是讨论的比较多的,那就是数据接收后如何处理的问题。这也是一个令刚接触 Socket 开发的人很头疼的问题。 因为 Socket 的 TCP 通讯中有一个“粘包”的现象,既:大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到,多个小包被组成一个大包被接收。有时候一个大数据包又会被拆成多个小数据包发送。这样就存在一个将数据包拆分和重新组合的问题。那么如何去处理这个问题呢?这就是我今日要讲的通讯协议。所谓的协议就是通讯双方协商并制定好要传送的数据的结构与格式。并按制定好的格式去组合与分析数据。从而使数据得以被准确的理解和处理。那么我们如何去制定通讯协议呢?很简单,就是指定数据中各个字节所代表的意义。比如说:第一位代表封包头,第二位代表封类型,第三、四位代表封包的数据长度。然后后面是实际的数据内容。如下面这个例子:010106 0001 0f ef 87 56 34协议类别协议代码数据长度实际数据前面三部分称之为封包头,它的长度是固定的,第四部分是封包数据,它的长度是不固定的,由第三部分标识其长度。因为我们的协议将用在 TCP 中,所以我没有加入校验位。原因是 TCP 可以保证数据的完整性。校验位是没有必要存在的。接下来我们要为这个数据封包声明一个类来封装它: 1 public class Message 2 { 3 private byte _class; 4 private byte _flag; 5 private int _size; 6 private byte[] _content;下载后可任意编辑 7 8 public byte[] Content 9 {10 get { return _content; }11 set { _content = value; }12 }1314 public int Size15 {16 get { return _size; }17 set { _size = value; }18 }1920 public byte Flag21 {22 get { return _flag; }23 set { _flag = value; }24 }2526 public byte Class27 {28 get { return _class; }29 set { _class = value; }30 }下载后可任意编辑3132 public Message()33 {3435 }3637 public Message(byte @class, byte flag, byte[] content)38 {39 _class = @class;40 _flag = flag;41 _size = content.Length;42 _content = content;43 }4445 public byte[] ToBytes()46 {47 byte[] _byte;48 using (MemoryStream mem = new MemoryStr...