赞
踩
Channel 的生命周期状态
Channel 的方法
任务调度
线程管理
线程的分配
ChannelHandlerContext 的 API
当使用 ChannelHandlerContext 的 API 的时候,有以下两点:
堆缓冲区
直接缓冲区
复合缓冲区
ByteBufAllocator 接口
名称 | 描述 |
---|---|
buffer() | 返回一个基于堆或者直接内存存储的 ByteBuf |
heapBuffer() | 返回一个基于堆内存存储的 ByteBuf |
directBuffer() | 返回一个基于直接内存存储的 ByteBuf |
compositeBuffer() | 返回一个可以通过添加最大到指定数目的基于堆的或者直接 内存存储的缓冲区来扩展的 CompositeByteBuf |
ioBuffer() | 返回一个用于套接字的 I/O 操作的 ByteBuf,当所运行的环境具有 sun.misc.Unsafe 支持时,返回基于直接内存存储的 ByteBuf, 否则返回基于堆内存存储的 ByteBuf;当指定使用 PreferHeapByteBufAllocator 时,则只会返回基于堆内存存储的 ByteBuf。 |
Channel channel=...;
ByteBufAllocator alloc = channel.alloc();
ChannelHandlerContext ctx=...;
ByteBufAllocator alloc = ctx.alloc();
Unpooled 缓冲区
名称 | 描述 |
---|---|
buffer() | 返回一个未池化的基于堆内存存储的 ByteBuf |
directBuffer() | 返回一个未池化的基于直接内存存储的 ByteBuf |
wrappedBuffer() | 返回一个包装了给定数据的 ByteBuf |
copiedBuffer() | 返回一个复制了给定数据的 ByteBuf |
ByteBuf buf=...;
int index = buf.forEachByte(ByteBufProcessor.FIND_CR);
1、对于入站请求,Netty 的 EventLoop 在处理 Channel 的读操作时进行分配 ByteBuf,对于这类 ByteBuf,需要我们自行进行释放,有三种方式,或者使用 SimpleChannelInboundHandler,或者在重写 channelRead()方法使用 ReferenceCountUtil.release()或者使用 ctx.fireChannelRead 继续向后传递;
2、对于出站请求,不管 ByteBuf 是否由我们的业务创建的,当调用了 write 或者 writeAndFlush 方法后,Netty 会自动替我们释放,不需要我们业务代码自行释放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。