java socket 包头包体_自定义协议封装包头、包体
1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.IO;4 usingSystem.Text;5
6 //消息解析器
7 public classMarshalEndian8 {9 //用于存儲剩余未解析的字節數
10 private List _LBuff = new List(2);11 //默認是utf8的編碼格式
12 private UTF8Encoding utf8 = newUTF8Encoding();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 voidDispose()22 {23 this.Dispose(true);24 GC.SuppressFinalize(this);25 }26
27 protected virtual void Dispose(boolflag1)28 {29 if(flag1)30 {31 IDisposable disposable2 = this.utf8 asIDisposable;32 if (disposable2 != null) { disposable2.Dispose(); }33 IDisposable disposable = this._LBuff asIDisposable;34 if (disposable != null) { disposable.Dispose(); }35 }36 }37
38 public byte[] Encode(TSocketMessage msg)39 {40 MemoryStream ms = newMemoryStream();41 BinaryWriter bw = new BinaryWriter(ms, newUTF8Encoding());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 returnms.ToArray();64 }65
66 public List GetDcAppMess(byte[] buff, intlen)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(2);79 }80
81 List list = new List();82 MemoryStream ms = newMemoryStream(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)
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(newTSocketMessage(msgID, _buff));118 if ((buffers.BaseStream.Length - buffers.BaseStream.Position) > 0)119 {120 gotoLabel_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 returnlist;141 }142 }
總結
以上是生活随笔為你收集整理的java socket 包头包体_自定义协议封装包头、包体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java signature 性能_Ja
- 下一篇: java 中策略模式_JAVA中的策略模