本文主要介绍以下几个相关类:
• ChannelPipeline
• ChannelHandlerContext
• ChannelHandler
• Inbound vs outbound(入站和出站)
接受客户端的连接和创建连接只是应用程序中的一步,更加重要的还是处理传入传出的数据。netty提供了强大的事件处理机制,允许用户自定义ChannelHandler的实现来处理数据。
1.ChannelPipeline
ChannelPipeline是ChannelHandler实例的列表(或则说是容器),用于处理或截获通道的接收和发送数据。ChannelPipeline提供了一种高级的截取过滤器模式,让用户可以在ChannelPipeline中完全控制一个事件及如何处理ChannelHandler与ChannelPipeline的交互。
可以这样说,一个新的通道就对应一个新的ChannelPipeline并附加至通道。一旦连接,通道Channel和ChannelPipeline之间的耦合是永久性的。通道Channel不能附加其他的ChannelPipeline或从ChannelPipeline分离。
下图显示了ChannelHandler在ChannelPipeline中的IO处理示意图:
很明显,ChannelPipeline里面就是一个ChannelHandler的列表。如果一个入站IO事件被触发,这个事件会从第一个开始依次通过ChannelPipeline中的ChannelHandler。若是一个入站I/O事件,则会从最后一个开始依次通过ChannelPipeline中的ChannelHandler。ChannelHandler可以处理事件并检查类型,如果某个ChannelHandler不能处理则会跳过,并将事件传递到下一个ChannelHandler。ChannelPipeline可以动态添加、删除、替换其中的ChannelHandler,这样的机制可以提高灵活性。
修改ChannelPipeline的方法:
• addFirst(…),添加ChannelHandler在ChannelPipeline的第一个位置
• addBefore(…),在ChannelPipeline中指定的ChannelHandler名称之前添加ChannelHandler
• addAfter(…),在ChannelPipeline中指定的ChannelHandler名称之后添加ChannelHandler
• addLast(ChannelHandler…),在ChannelPipeline的末尾添加ChannelHandler
• remove(…),删除ChannelPipeline中指定的ChannelHandler
• replace(…),替换ChannelPipeline中指定的ChannelHandler
比如:
ChannelPipeline pipeline = ch.pipeline();
FirstHandler firstHandler = new FirstHandler();
pipeline.addLast("handler1", firstHandler);
pipeline.addFirst("handler2", new SecondHandler());
pipeline.addLast("handler3", new ThirdHandler());
pipeline.remove("“handler3“");
pipeline.remove(firstHandler);
pipeline.replace("handler2"