当前位置: 首页 > news >正文

关于tio 协议(Packet)中 消息头的长度(HEADER_LENGTH)的理解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

用了t-io很长时间了,但是没有深层次的 阅读代码,写本篇博客为了记录下 对 tio  协议(Packet)中 消息头的长度(HEADER_LENGTH)的理解

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import org.nutz.log.Log;
import org.nutz.log.Logs;

public class ByteBufferTest {
	
    private static final Log log = Logs.get();
	private final static byte MSG_TYPE = 8;
	
	public static void main(String[] args) throws Exception{
		
		/**
		 * 消息头的长度 1+4  
		 * 所谓 1 是 协议定义的消息类型 例如 byte MSG_TYPE = 8; 占一个字节
		 * 所谓 4 是 消息体的长度  int类型 占4个字节
		 */
		int headerLen = 5;
		
		String body = "hello tio";
		int bodyLen = body.length();//消息体长度
		
		int allLen = headerLen + bodyLen;

		ByteBuffer buffer = null;
		buffer = ByteBuffer.allocate(allLen);	
		buffer.order(ByteOrder.BIG_ENDIAN);
		
		buffer.put(ByteBufferTest.MSG_TYPE);
		log.infof("[encode1]-limit=%s,position=%s", buffer.limit(),buffer.position());

		buffer.putInt(bodyLen);
		log.infof("[encode2]-limit=%s,position=%s", buffer.limit(),buffer.position());
		
		buffer.put(new String(body).getBytes("UTF-8"));
		log.infof("[encode3]-limit=%s,position=%s", buffer.limit(),buffer.position());

		
		buffer.position(0);
		
		byte type = buffer.get();//消息类型
		System.out.println("消息类型:" + type);
		
		int bodyLength = buffer.getInt();//消息体长度
		System.out.println("消息体长度:" + bodyLength);
		
		byte[] dst = new byte[bodyLength];//消息内容
		buffer.get(dst);
		System.out.println("消息内容:" + new String(dst));
	}
	
	/**
	 * int 转byte
	 * int 类型 占4个字节
	 * @param val
	 * @return
	 */
	public static byte[] intToByte(int val){
		byte[] b = new byte[4];
		b[0] = (byte)(val & 0xff);
		b[1] = (byte)((val >> 8) & 0xff);
		b[2] = (byte)((val >> 16) & 0xff);
		b[3] = (byte)((val >> 24) & 0xff);
		return b;
		
	}
}

 

转载于:https://my.oschina.net/longtutengfei/blog/2992607

相关文章:

  • 机器学习练习(一)-使用jupyter notebook
  • Mysql 批量写入数据,对于这类性能问题,你是如何优化的
  • spring mvc返回json字符串的方式
  • Linux 下的dd命令使用详解
  • ES 5 中 判断数组的方法
  • [HNOI2008]水平可见直线
  • 电商产品设计实战(二):电商整体产品架构
  • Integer类toString(int i,int radix)方法
  • 普通java工程的resources目录寻址
  • express.js的介绍及使用
  • Intel要在中国投35亿美金造这种闪存,3DxPoint技术牛在哪里?
  • MongoDB系统CentOS 7.1 crash的排障过程
  • MySQL建表语句转PostgreSQL建表语句全纪录
  • JAVA设计模式之观察者模式
  • 安装mongo,新建数据库,添加普通用户
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Amaple教程】5. 插件
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • css布局,左右固定中间自适应实现
  • es6--symbol
  • export和import的用法总结
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript异步流程控制的前世今生
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MobX
  • PHP CLI应用的调试原理
  • php中curl和soap方式请求服务超时问题
  • tweak 支持第三方库
  • Xmanager 远程桌面 CentOS 7
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于Flux,Vuex,Redux的思考
  • 关于使用markdown的方法(引自CSDN教程)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 排序算法之--选择排序
  • 如何在GitHub上创建个人博客
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 网页视频流m3u8/ts视频下载
  • 为视图添加丝滑的水波纹
  • scrapy中间件源码分析及常用中间件大全
  • 说说我为什么看好Spring Cloud Alibaba
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #include<初见C语言之指针(5)>
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.11) SiK Radio v2(一)
  • (九)One-Wire总线-DS18B20
  • (力扣)循环队列的实现与详解(C语言)
  • (力扣题库)跳跃游戏II(c++)
  • (七)理解angular中的module和injector,即依赖注入
  • (转)菜鸟学数据库(三)——存储过程
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)一些感悟
  • .form文件_SSM框架文件上传篇
  • .Net - 类的介绍