美文网首页
第5章 ByteBuf

第5章 ByteBuf

作者: 横渡 | 来源:发表于2019-07-29 15:32 被阅读0次

ByteBuf

主要内容

  • ByteBuf -- Netty 的数据容器
  • API 的详细信息
  • 用例
  • 内存分配

网络数据的基本单位是字节,Java IO提供了ByteBuffer作为字节的容器,但这个类用起来过于复杂。Netty 提供了ByteBuf来操作字节。

ByteBuf 的API

ByteBuf提供读访问索引(readerIndex)和写访问索引(writerIndex)来控制字节数组。ByteBuf API具有以下优点:

  1. 允许用户自定义缓冲区类型扩展
  2. 通过内置的复合缓冲区类型实现透明的零拷贝
  3. 容量可按需增长
  4. 读写这两种模式之间不需要调用类似于JDK的ByteBuffer的flip()方法进行切换
  5. 读和写使用不同的索引
  6. 支持方法的链式调用
  7. 支持引用计数
  8. 支持池化

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 -- 处理出站数据并且允许拦截所有的操作。

相关文章

网友评论

      本文标题:第5章 ByteBuf

      本文链接:https://www.haomeiwen.com/subject/gmbgcqtx.html