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 包头包体_自定义协议封装包头、包体相关推荐
- 简单易懂的Socket TCP网络通讯知识-消息协议和数据包
不管用的是什么样的协议方式,基本通讯的原理 到底层 都是 byte[]数组 传递. 1.协议的定义 协议本身只是 通讯时候 前后端 定义的变量类型和顺序的集合. 比如说,要做一个登陆的消息传递, 需要 ...
- java扫描包下类_实现获取扫描指定包路径下的jar文件或class文件JarPojoHandler类示例代码...
通过JarPojoHandler类实现了扫描指定路径下如何获取所有的JAR包或class文件,可以对特定class对象文件筛选过滤等,具体代码如下所示import java.io.File;@b@im ...
- java socket多人聊天_如何运用Java socket实现多人聊天室功能
导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...
- java解析c的结构体_解析C语言中结构体struct的对齐问题
首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,do ...
- 安卓抓包软件_你们要的抓包神器!以及抓包原理
昨天讲到 农行提固定额度失败原因查看方法! 发现好多卡友对这个抓包很有兴趣,今天就着重讲讲抓包的流程. 先讲讲这个抓包的原理:我们手机里面的银行app和服务器连接,把银行app看成是A,把服务器看成是 ...
- Netty工作笔记0083---通过自定义协议解决粘包拆包问题1
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 咱们写一个案例,来解决拆包,粘包的问题 自己定义一个协议,先去,这里只有协议内容和长度 然后用以前 ...
- java socket 获取网页源代码_通过java.net.Socket 类抓取网页内容
/** 文件名 : Firstsocket.java 描述 :通过 java.net.Socket 类访问一个web页面,并且返回结果 作者: 慈勤强 cqq1978@yeah.net 参考:http ...
- java socket 端口复用_Java TCP/IP协议的Socket如何设置端口复用?
Java TCP/IP协议的Socket如何设置端口复用? 关注:123 答案:3 mip版 解决时间 2021-01-30 18:33 提问者情婲.毒 2021-01-29 18:58 情境如下 ...
- java 克隆对象工具类_关于dorado-core源码包中CloneUtils克隆工具类对对象进行克隆复制操作...
一.前言 基于dorado.core.jar开源包中的com.bstek.dorado.util.CloneUtils克隆工具类,对对象进行通过java.lang.reflect.Method映射克隆 ...
最新文章
- java数列求和_java中关于数列求和的计算方法
- java修饰静态_Java-static修饰符及静态代码块
- linux标准i/o,Linux 标准I/O笔记
- Beaglebone Black的启动
- Datatable表格点击某个单元格可以获取整行数据
- Vue源码后记-更多options参数(1)
- 按行拼接两个txt文件的python实现
- SPOJ3276 D-query
- 前端常用60余种工具方法(上)
- UI模板素材|教你App中的页面指示器要如何设计
- 计算机教师自检自查报告,信息技术教学工作自查报告
- 回收站有html文件,回收站在哪个盘?(每个磁盘上都有一个回收站)
- github下载慢怎么办,国内下载release内容的解决办法
- 红米2 miui android5.1,Redmi 2 MIUI7 Android 5.1闪回到Android 4.4和第三方Rec更新5
- FastReport 动态加载图片
- Python爬虫程序实例
- Linux下安装JDK(rpm版)
- 01.自我意识的觉醒
- 【转载】一些软件设计原则
- ZYNQ-7的芯片引脚
热门文章
- Rust和C / C ++的跨语言链接时间优化LTO
- 2021年大数据常用语言Scala(二):Scala开发环境安装
- CentOS7.4 安装mongodb
- python join 的使用
- python 正则表达式 re.compile() 的使用
- Android layer-list 使用
- 自己理解接口回调入门
- POJ 2942 Knights of the Round Table (算竞进阶习题)
- 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
- 20172324 2018-2019-1《程序设计与数据结构》实验2报告