zoukankan      html  css  js  c++  java
  • 自定义协议封装包头、包体

    底层通信消息类,定义消息ID、消息体,和初始化

     1 using System;  
     2   
     3 /// <summary>  
     4 /// 底层通信消息  
     5 /// </summary>  
     6 public class TSocketMessage : IDisposable  
     7 {  
     8     /// <summary>  
     9     /// 消息ID  
    10     /// </summary>  
    11     public int MsgID;  
    12     /// <summary>  
    13     /// 消息内容  
    14     /// </summary>  
    15     public byte[] MsgBuffer;  
    16   
    17     public TSocketMessage(int msgID, byte[] msg)  
    18     {  
    19         this.MsgID = msgID;  
    20         this.MsgBuffer = msg;  
    21     }  
    22   
    23     public void Dispose()  
    24     {  
    25         this.Dispose(true);  
    26         GC.SuppressFinalize(this);  
    27     }  
    28   
    29     protected virtual void Dispose(bool flag1)  
    30     {  
    31         if (flag1) { this.MsgBuffer = null; }  
    32     }  
    33 }  

    消息解析器,封装包头、包体、解析包

      1 using System;  
      2 using System.Collections.Generic;  
      3 using System.IO;  
      4 using System.Text;  
      5   
      6 // 消息解析器  
      7 public class MarshalEndian  
      8 {  
      9     //用于存储剩余未解析的字节数  
     10     private List<byte> _LBuff = new List<byte>(2);  
     11     //默认是utf8的编码格式  
     12     private UTF8Encoding utf8 = new UTF8Encoding();  
     13   
     14     //包头1  
     15     const Int16 t1 = 0x55;  
     16     //包头2  
     17     const Int16 t2 = 0xAA;  
     18     //字节数常量 两个包头4个字节,一个消息id4个字节,封装消息长度 int32 4个字节  
     19     const Int32 ConstLenght = 8;  
     20   
     21     public void Dispose()  
     22     {  
     23         this.Dispose(true);  
     24         GC.SuppressFinalize(this);  
     25     }  
     26   
     27     protected virtual void Dispose(bool flag1)  
     28     {  
     29         if (flag1)  
     30         {  
     31             IDisposable disposable2 = this.utf8 as IDisposable;  
     32             if (disposable2 != null) { disposable2.Dispose(); }  
     33             IDisposable disposable = this._LBuff as IDisposable;  
     34             if (disposable != null) { disposable.Dispose(); }  
     35         }  
     36     }  
     37   
     38     public byte[] Encode(TSocketMessage msg)  
     39     {  
     40         MemoryStream ms = new MemoryStream();  
     41         BinaryWriter bw = new BinaryWriter(ms, new UTF8Encoding());  
     42         byte[] msgBuffer = msg.MsgBuffer;  
     43  
     44         #region 封装包头  
     45         bw.Write((Int16)t1);  
     46         bw.Write((Int16)t2);  
     47         #endregion  
     48  
     49         #region 包协议  
     50         if (msgBuffer != null)  
     51         {  
     52             bw.Write((Int32)(msgBuffer.Length + 4));  
     53             bw.Write(msg.MsgID);  
     54             bw.Write(msgBuffer);  
     55         }  
     56         else { bw.Write((Int32)0); }  
     57         #endregion  
     58   
     59         bw.Close();  
     60         ms.Close();  
     61         bw.Dispose();  
     62         ms.Dispose();  
     63         return ms.ToArray();  
     64     }  
     65   
     66     public List<TSocketMessage> GetDcAppMess(byte[] buff, int len)  
     67     {  
     68         //拷贝本次的有效字节  
     69         byte[] _b = new byte[len];  
     70         Array.Copy(buff, 0, _b, 0, _b.Length);  
     71         buff = _b;  
     72         if (this._LBuff.Count > 0)  
     73         {  
     74             //拷贝之前遗留的字节  
     75             this._LBuff.AddRange(_b);  
     76             buff = this._LBuff.ToArray();  
     77             this._LBuff.Clear();  
     78             this._LBuff = new List<byte>(2);  
     79         }  
     80   
     81         List<TSocketMessage> list = new List<TSocketMessage>();  
     82         MemoryStream ms = new MemoryStream(buff);  
     83         BinaryReader buffers = new BinaryReader(ms, this.utf8);  
     84         try  
     85         {  
     86             byte[] _buff;  
     87             Label_00983:  
     88  
     89             #region 包头读取  
     90             //循环读取包头             
     91             //判断本次解析的字节是否满足常量字节数   
     92             if ((buffers.BaseStream.Length - buffers.BaseStream.Position) < ConstLenght)  
     93             {  
     94                 _buff = buffers.ReadBytes((int)(buffers.BaseStream.Length - buffers.BaseStream.Position));  
     95                 this._LBuff.AddRange(_buff);  
     96                 return list;  
     97             }  
     98             Int16 tt1 = buffers.ReadInt16();  
     99             Int16 tt2 = buffers.ReadInt16();  
    100             if (!(tt1 == t1 && tt2 == t2))  
    101             {  
    102                 long ttttt = buffers.BaseStream.Seek(-3, SeekOrigin.Current);  
    103                 goto Label_00983;  
    104             }  
    105             #endregion  
    106  
    107             #region 包协议  
    108             int offset = buffers.ReadInt32();  
    109             #endregion  
    110  
    111             #region 包解析  
    112             //剩余字节数大于本次需要读取的字节数  
    113             if (offset <= (buffers.BaseStream.Length - buffers.BaseStream.Position))  
    114             {  
    115                 int msgID = buffers.ReadInt32();  
    116                 _buff = buffers.ReadBytes(offset - 4);  
    117                 list.Add(new TSocketMessage(msgID, _buff));  
    118                 if ((buffers.BaseStream.Length - buffers.BaseStream.Position) > 0)  
    119                 {  
    120                     goto Label_00983;  
    121                 }  
    122             }  
    123             else  
    124             {  
    125                 //剩余字节数刚好小于本次读取的字节数 存起来,等待接受剩余字节数一起解析  
    126                 _buff = buffers.ReadBytes((int)(buffers.BaseStream.Length - buffers.BaseStream.Position + ConstLenght));  
    127                 this._LBuff.AddRange(_buff);  
    128             }  
    129             #endregion  
    130         }  
    131         catch (Exception ex) { Console.WriteLine(ex); }  
    132         finally  
    133         {  
    134             if (buffers != null) { buffers.Dispose(); }  
    135             buffers.Close();  
    136             if (buffers != null) { buffers.Dispose(); }  
    137             ms.Close();  
    138             if (ms != null) { ms.Dispose(); }  
    139         }  
    140         return list;  
    141     }  
    142 }  
  • 相关阅读:
    line
    同步fifo的verilogHDL设计实例
    在DE1-SOC上运行Linux
    DE1-SOC连接设定
    Tcl语言笔记之二
    Tcl语言笔记之一
    关于复位赋初值的问题
    Altera FPGA中的pin进一步说明
    Altera FPGA中的pin简介
    笔记之Cyclone IV第一卷第四章Cyclone IV器件中的嵌入式乘法器
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/6815138.html
Copyright © 2011-2022 走看看