netty 网络字节序
阅读数:268 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
在计算机中,我们以字节为单位,一个字节为8bit。
而数据存储中的字节顺序多取决于硬件设计,即所谓的大端存储和小端存储。Intel处理器使用小端存储,PowerPc的处理器采用大端存储。
当使用互联网通信时,双方必须为字节数据的顺序达成一致的协议,才能正常解析,这就引出了计算机网络中的大小端。
1、字节的高低
比如 11001100 11110000,从数学上来讲,左边的11001100是高位字节,右边的11110000是低位字节。
2、地址的高低
地址排列始终是从左往右的,就跟数组一样,[byte0,byte1,…],索引小的就是低地址,索引大的就是高地址
二、大小端
1、大端
高字节数据存在低地址中,低字节数据存在高地址中。
通俗的讲,先得到或处理的字节是高位字节。很类似人类的从左到右读数字,“万千百十个”
从存储的角度看,即地址小的位置放高位字节,因为我们一般从低地址开始处理。从网络传输角度看,即先传输的是高字节。
2、小端
高字节数据存在高地址中,低字节数据存在低地址中
通俗的讲,先得到或处理的字节是低位字节。
三、Netty的大小端
Netty中默认的字节序是大端,即收发的第一个字节都是高字节。
在Netty中可以设置字节顺序:ByteOrder.BIG_ENDIAN,ByteOrder.LITTLE_ENDIAN。
一般来说,除了编码器配置参数外,最多影响的就是ByteBuf。
1、声明ByteBuf的大小端类型(默认是大端)
ByteBuf byteBuf= Unpooled.buffer(12).order(ByteOrder.LITTLE_ENDIAN);
2、如果不修改ByteBuf大小端,但对方使用的是小端序时
(1)读取
//byte不需要转换,因为就一个字节不分大小端
byteBuf111.readShortLE();
byteBuf111.readIntLE();
(2)写入
byteBuf111.writeIntLE(8);
byteBuf111.writeShortLE(8);
相关推荐
Java NIO根据操作系统不同,比如macosx是KQueueSelectorProvider、windows有WindowsSelectorProvider、Linux有EPollSelec
Netty提供了丰富的解码器抽象基类:主要分为两类:
(1)解码字节到消息(ByteToMessageDecoder和ReplayingDecoder)
(2)解码消
一、概述
Netty的强大的地方,是他能方便的实现自定义协议的网络传输。Netty基于Reactor模式:http://1024s.top/mbstudy/mbBlog/blogDetail?blog
ByteBuf是对字节的封装,有基于堆内存和直接内存。若是堆内存,应用程序无需考虑什么时候释放,因为GC是帮助做,如果是直接内存,那么需要主动释放。
每个ByteBuf对象都有一个引用计数,当这个数值
Netty中的HashedWheelTimer可以用于提交延迟任务,Java里的Time组件也具备相同的功能,不过Time是基于执行是基于优先队列实现的,相当于需要对所有的任务基于执行的时间排个序。而
一、netty客户端流控
1、这几种情况下,如果客户端没有流控保护,很容易发生内存泄露。
(1)网络瓶颈,当客户端发送速度超过网络链路处理能力,会导致客户端发送队列积压。
(2)当对端读取速度小于已方
LineBasedFrameDecoder以换行符\n或\r\n作为依据,遇到\r\n都认为是一条完整的消息。
而DelimiterBasedFrameDecoder允许我们指定任
HttpServerCodec
HtttpServerCodec只能处理像http get的请求,也就是数据带在url问号后面的http请求。
GET请求包括两部