我是Netty的新手,并不真正理解Netty中处理程序的流程。我想知道的是上游和下游处理程序之间的区别。为什么我们不能像在上游那样拦截下游处理程序中的消息?下游和上游是否与正常情况相同?
区别在于处理传入(上游)和另一个传出(下游)。我认为在查看qazxsw poi的javadoc之后,事件/消息流变得更加清晰。
我还应该注意,上游事件只会由IO-Thread触发,因此如果你使用每个ChannelPipeline
新的ChannelUpstreamHandler
,则不需要在那里同步字段访问。任何线程都可以触发下游事件,因此需要同步对字段的访问。
我认为这些想法来自网络堆栈。 Netty的处理程序 - 管道类比类似于OSI网络层堆栈。看一下OSI网络层的外观...... ChannelPipeline
将每个处理程序视为“一个层”,将整个管道视为“一个网络堆栈”,将物理链接视为“IO源”,将用户视为“应用程序逻辑处理程序”。使用相同的管道(堆栈),我们需要做两个功能
所以基本上相同的管道必须做两件事(接收消息并发回消息)。让我们考虑一个具体的例子(具有身份验证和加密的服务器),3个处理程序构成一个管道:
让我们看看每个接收消息的责任
UpstreamEvent
。DownstreamEvent
。UpstreamEvent
。因此,从逻辑上讲,每个处理程序都必须实现以下功能:
UpstreamEvent
和ChannelUpstreamHandler
ChannelDownstreamHandler
ChannelUpstreamHandler
所以如果你有一个ChannelUpstreamHandler
,上面提到3个处理程序,
ChannelPipeline
,Netty将UpstreamEvent
转发到(1)然后(2)然后可选地(3),因为所有3都实现了UpstreamEvent
。ChannelUpstreamHandler
调用(创建write
)启动。 Netty将把DownstreamEvent
转发给(1)(只有一个,之前(3)并实施DownstreamEvent
)。因此,给定带有处理程序的管道,当创建ChannelDownstreamHandler
时(通过'IO source'),Netty将按顺序从1到n调用管道中的所有处理程序,这已经实现了UpstreamEvent
(n是处理程序的数量,在上面的示例中) n = 3)。当创建ChannelUpstreamHandler
时(通过用户应用程序代码),Netty将按顺序从n到1调用管道中的所有处理程序,这已经实现了DownstreamEvent
。由于类可以实现两个接口,因此处理程序可以是ChannelDownstreamHandler
和ChannelUpstreamHandler
。请注意,所有ChannelDownstreamHandler
都是由'IO Source'创建的,所有UpstreamEvent
都是由用户应用程序逻辑创建的。
DownstreamEvent
的例子:
UpstreamEvent
的例子:
希望它能帮助你回答为什么我们需要处理程序的两个行为(上游和下游),netty如何通过qazxswpoi和DownstreamEvent
解决发送和接收问题。我们如何真正在现实世界的应用程序中使用这些结构。
您的答案在此结束,有关额外内容,您可以在下面继续。
让我们看看每个转发消息的责任:
Downstream
)Upstream
和ctx.sendDownstream(e)
)ctx.sendDownstream(e)
和ctx.sendUpstream(e)
)