Netty学习006(ChannelPipeline)

ChannelPipeline不是单独存在,它肯定会和Channel、ChannelHandler、ChannelHandlerContext关联在一起。
上图↓
eg

ChannelInboundHandler(入站): 处理输入数据和Channel状态类型改变。

                                      适配器: ChannelInboundHandlerAdapter(适配器设计模式)

                                      常用的: SimpleChannelInboundHandler(会对没有外界引用的资源进行一定的清理,

并且入站的消息可以通过泛型来规定)
ChannelOutboundHandler(出站): 处理输出数据

                                      适配器: ChannelOutboundHandlerAdapter

ChannelHandler 生命周期

	handlerAdded: 当 ChannelHandler 添加到 ChannelPipeline 调用
	handlerRemoved: 当 ChannelHandlerChannelPipeline 移除时调用
	exceptionCaught: 当 ChannelPipeline 执行抛出异常时调用

关于ChannelPipeline上图↓
ChannelPipeline
1-ChannelPipeline类是ChannelHandler实例对象的链表,用于处理或截获通道的接收和发送数据
2-ChannelPipeline类它提供了一种高级的截取过滤模式(类似serverlet中的filter功能),让用户可以ChannelPipeline中完全控制一个事件以及如何处理ChannelHandler与ChannelPipeline的交互
3-每个新的通道Channel,都会创建一个新的ChannelPipeline,并将器pipeline附加到channel中

常用方法如下↓

addFirst(...)   //添加ChannelHandler在ChannelPipeline的第一个位置
addBefore(...)   //在ChannelPipeline中指定的ChannelHandler名称之前添加ChannelHandler
addAfter(...)   //在ChannelPipeline中指定的ChannelHandler名称之后添加ChannelHandler
addLast(...)   //在ChannelPipeline的末尾添加ChannelHandler
remove(...)   //删除ChannelPipeline中指定的ChannelHandler
replace(...)   //替换ChannelPipeline中指定的ChannelHandler

入站出战的顺序

ch.pipeline().addLast(new InboundHandler1());
          ch.pipeline().addLast(new OutboundHandler1());
          ch.pipeline().addLast(new OutboundHandler2());
          ch.pipeline().addLast(new InboundHandler2());
  或者:
          ch.pipeline().addLast(new OutboundHandler1());
          ch.pipeline().addLast(new OutboundHandler2());
          ch.pipeline().addLast(new InboundHandler1());
          ch.pipeline().addLast(new InboundHandler2());
不管什么顺序添加,执行顺序如下↓
	InboundHandler1--> InboundHandler2 -->OutboundHandler2 -->OutboundHandler1
总结如下↓
	1-InboundHandler顺序执行,OutboundHandler逆序执行
	2-InboundHandler之间传递数据,通过ctx.fireChannelRead(msg)
	3-InboundHandler通过ctx.write(msg),则会传递到outboundHandler
	4-使用ctx.write(msg)传递消息,Inbound需要放在结尾,在Outbound之后,不然outboundhandler会不执行;但是使用channel.write(msg)、pipline.write(msg)情况会不一致,都会执行,那是因为channel和pipline会贯穿整个流。

来个图↓
pipeline
ChannelPipeline并不是直接管理ChannelHandler,而是通过ChannelHandlerContext来间接管理
盗图
Pipeline的事件传播,是靠Pipeline,Context和Handler共同协作完成的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值