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 包头包体_自定义协议封装包头、包体相关推荐

  1. 简单易懂的Socket TCP网络通讯知识-消息协议和数据包

    不管用的是什么样的协议方式,基本通讯的原理 到底层 都是 byte[]数组 传递. 1.协议的定义 协议本身只是 通讯时候 前后端 定义的变量类型和顺序的集合. 比如说,要做一个登陆的消息传递, 需要 ...

  2. java扫描包下类_实现获取扫描指定包路径下的jar文件或class文件JarPojoHandler类示例代码...

    通过JarPojoHandler类实现了扫描指定路径下如何获取所有的JAR包或class文件,可以对特定class对象文件筛选过滤等,具体代码如下所示import java.io.File;@b@im ...

  3. java socket多人聊天_如何运用Java socket实现多人聊天室功能

    导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...

  4. java解析c的结构体_解析C语言中结构体struct的对齐问题

    首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,do ...

  5. 安卓抓包软件_你们要的抓包神器!以及抓包原理

    昨天讲到 农行提固定额度失败原因查看方法! 发现好多卡友对这个抓包很有兴趣,今天就着重讲讲抓包的流程. 先讲讲这个抓包的原理:我们手机里面的银行app和服务器连接,把银行app看成是A,把服务器看成是 ...

  6. Netty工作笔记0083---通过自定义协议解决粘包拆包问题1

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 咱们写一个案例,来解决拆包,粘包的问题 自己定义一个协议,先去,这里只有协议内容和长度 然后用以前 ...

  7. java socket 获取网页源代码_通过java.net.Socket 类抓取网页内容

    /** 文件名 : Firstsocket.java 描述 :通过 java.net.Socket 类访问一个web页面,并且返回结果 作者: 慈勤强 cqq1978@yeah.net 参考:http ...

  8. java socket 端口复用_Java TCP/IP协议的Socket如何设置端口复用?

    Java TCP/IP协议的Socket如何设置端口复用? 关注:123  答案:3  mip版 解决时间 2021-01-30 18:33 提问者情婲.毒 2021-01-29 18:58 情境如下 ...

  9. java 克隆对象工具类_关于dorado-core源码包中CloneUtils克隆工具类对对象进行克隆复制操作...

    一.前言 基于dorado.core.jar开源包中的com.bstek.dorado.util.CloneUtils克隆工具类,对对象进行通过java.lang.reflect.Method映射克隆 ...

最新文章

  1. java数列求和_java中关于数列求和的计算方法
  2. java修饰静态_Java-static修饰符及静态代码块
  3. linux标准i/o,Linux 标准I/O笔记
  4. Beaglebone Black的启动
  5. Datatable表格点击某个单元格可以获取整行数据
  6. Vue源码后记-更多options参数(1)
  7. 按行拼接两个txt文件的python实现
  8. SPOJ3276 D-query
  9. 前端常用60余种工具方法(上)
  10. UI模板素材|教你App中的页面指示器要如何设计
  11. 计算机教师自检自查报告,信息技术教学工作自查报告
  12. 回收站有html文件,回收站在哪个盘?(每个磁盘上都有一个回收站)
  13. github下载慢怎么办,国内下载release内容的解决办法
  14. 红米2 miui android5.1,Redmi 2 MIUI7 Android 5.1闪回到Android 4.4和第三方Rec更新5
  15. FastReport 动态加载图片
  16. Python爬虫程序实例
  17. Linux下安装JDK(rpm版)
  18. 01.自我意识的觉醒
  19. 【转载】一些软件设计原则
  20. ZYNQ-7的芯片引脚

热门文章

  1. Rust和C / C ++的跨语言链接时间优化LTO
  2. 2021年大数据常用语言Scala(二):Scala开发环境安装
  3. CentOS7.4 安装mongodb
  4. python join 的使用
  5. python 正则表达式 re.compile() 的使用
  6. Android layer-list 使用
  7. 自己理解接口回调入门
  8. POJ 2942 Knights of the Round Table (算竞进阶习题)
  9. 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
  10. 20172324 2018-2019-1《程序设计与数据结构》实验2报告