ByteBuf
主要内容
- ByteBuf -- Netty 的数据容器
- API 的详细信息
- 用例
- 内存分配
网络数据的基本单位是字节,Java IO提供了ByteBuffer作为字节的容器,但这个类用起来过于复杂。Netty 提供了ByteBuf来操作字节。
ByteBuf 的API
ByteBuf提供读访问索引(readerIndex)和写访问索引(writerIndex)来控制字节数组。ByteBuf API具有以下优点:
- 允许用户自定义缓冲区类型扩展
- 通过内置的复合缓冲区类型实现透明的零拷贝
- 容量可按需增长
- 读写这两种模式之间不需要调用类似于JDK的ByteBuffer的flip()方法进行切换
- 读和写使用不同的索引
- 支持方法的链式调用
- 支持引用计数
- 支持池化
5.2 ByteBuf类---Netty的数据容器
** ByteBuf的使用模式**
ByteBuf 有三种使用模式,最常用的是将数据存储到JVM的堆空间中,这种模式被称为支撑数组。直接缓冲区模式,相对于堆的缓冲区,它的分配和释放都较为昂贵。复合缓冲区模式CompositeByteBuf。
ByteBuf heapBuf = ...;
if (heapBuf.hasArray()) {
byte[] array = heapBuf.array();
int offset = heapBuf.arrayOffset() + heapBuf.readerIndex(); int
length = heapBuf.readableBytes();
handleArray(array, offset, length);
ChannelHandler
channel 声明周期
channelUnRegistered: channel已经被创建,还未注册到 EventLoop;
channelRegistered: channel已经被注册到 EventLoop;
channelActive: channel处于活动状态(已经连接至远程节点),可以收发数据;
channelInActive:channel没有被连接到远程节点
ChannelHandler生命周期方法
handlerAdded:把 ChannelHandler 添加到 ChannelPipeline 中时被调用
handlerRemoved:从 ChannelPipeline 中移除 ChannelHandler 时被调用
exceptionCaught:当处理过程中在 ChannelPipeline 中有错误产生时被调用
Netty 定义了下面两个重要的 ChannelHandler 子接口:
ChannelInboundHandler -- 处理入站数据及各种状态变化;
ChannelOutboundHandler -- 处理出站数据并且允许拦截所有的操作。












网友评论