有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`
Netty 是一个高性能的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Netty中,处理网络事件的核心组件是 ChannelPipeline,它持有一系列的 ChannelHandler。这些处理器分为两类:Inbound(入站)和 Outbound(出站)。
ChannelHandler 类型
- InboundHandler:用于处理入站数据以及各种状态变化事件。
- OutboundHandler:用于处理出站操作,例如打开连接、发送数据等。
加载顺序
在Netty中,ChannelHandler 的加载顺序是按照你添加它们到 ChannelPipeline 的顺序来的。例如:
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("inboundHandler1", new InboundHandler1());
pipeline.addLast("inboundHandler2", new InboundHandler2());
pipeline.addLast("outboundHandler1", new OutboundHandler1());
pipeline.addLast("outboundHandler2", new OutboundHandler2());
在这个例子中,InboundHandler1 和 InboundHandler2 是入站处理器,它们会首先被添加到管道中,随后是出站处理器 OutboundHandler1 和 OutboundHandler2。
执行顺序
入站事件(Inbound)
入站事件,如读取数据(channelRead),会从 ChannelPipeline 的头部开始,并按照添加的顺序向下传递给每个 InboundHandler。如果一个 InboundHandler 没有调用 ChannelHandlerContext 的 fireChannelRead 方法,那么入站事件将停止流动,不会传递给下一个处理器。
执行顺序示例:
InboundHandler1 -> InboundHandler2
出站事件(Outbound)
出站事件,如写数据(write)或关闭连接(close),会从 ChannelPipeline 的尾部开始,并按照添加的相反顺序向上传递给每个 OutboundHandler。如果一个 OutboundHandler 没有调用 ChannelHandlerContext 的相应出站方法,那么出站事件将停止流动,不会传递给上一个处理器。
执行顺序示例:
OutboundHandler2 -> OutboundHandler1
小结
在Netty中,ChannelHandler 的加载顺序是按照它们被添加到 ChannelPipeline 的顺序,而执行顺序则是入站事件按照添加顺序,出站事件按照相反的顺序。理解这个顺序对于设计Netty的网络应用程序是非常重要的,因为它影响到数据的处理流程和逻辑。


