Channel 的四个状态
ChannelHandlerAdapter 的方法,主要推送事件 到 pipeline 下个 ChannelHandler 直到 pipeline 的结 束。
这个类 也作为 ChannelInboundHandlerAdapter 和ChannelOutboundHandlerAdapter 的基础。
ChannelInboundHandler 实现覆盖了 channelRead() 方法处理进来的数据用来响应释放资源。 Netty 在 ByteBuf 上使用了资源池,所以当执行释放资源时可以减少内存的消耗。
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
System.out
.println("Server received: " + in.toString(CharsetUtil.UTF_8)); // 2.日志消息输出到控制台
ctx.write(in); // 3将所接收的消息返回给发送者。注意,这还没有冲刷数据
}
ChannelOutboundHandler
ChannelPipeline
每一个创建新 Channel ,分配一个新的 ChannelPipeline。这个关联是永久性的;Channel 既不能附上另一 个 ChannelPipeline 也不能分离当前这个。这是一个 Netty 的固定方面的组件生命周期,开发人员无需特 别处理。
根据它的起源,一个事件将由 ChannelInboundHandler 或ChannelOutboundHandler 处理。随后它将 调用 ChannelHandlerContext 实现转发到下一个相同的超类型的处理程序。
了 ChannelPipeline 主要是一系列 ChannelHandler。
通常每个 ChannelHandler 添加到 ChannelPipeline 将处理事件传递到 EventLoop( I/O 的线程
ChannelHandlerContext
接口 ChannelHandlerContext 代表 ChannelHandler 和ChannelPipeline 之间的关联,并在 ChannelHandler 添加到 ChannelPipeline 时创建一个实例。ChannelHandlerContext 的主要功能是管 理通过同一个 ChannelPipeline 关联的 ChannelHandler 之间的交互。
ChannelHandler 可以属于多个 ChannelPipeline ,它可以绑定多个 ChannelHandlerContext 实 例。然而,ChannelHandler 用于这种用法必须添加 @Sharable 注解。否则,试图将它添加到多个 ChannelPipeline 将引发一个异常。此外,它必须既是线程安全的又能安全地使用多个同时的通道(比如,连 接)。