netty中的ChannelHandler

本文深入探讨了Netty中的ChannelPipeline、ChannelHandlerContext、ChannelHandler及其子类,详细阐述了ChannelHandler如何处理入站和出站事件,以及如何动态修改ChannelPipeline。重点介绍了ChannelHandlerContext在事件传递中的作用,以及Channel的状态模型和不同类型的ChannelHandler。
摘要由CSDN通过智能技术生成

本文主要介绍以下几个相关类:
• 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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值