我是 Netty 的新手,并且不太了解 Netty 中处理程序的流程。我想知道的是上游和下游处理程序之间的区别。为什么我们不能像在上游那样拦截下游处理程序中的消息?下游和上游是否与正常情况相同?
答案 0 :(得分:7)
区别在于一个处理(上游)和另一个(下游)处理。
我认为在查看ChannelPipeline
的javadoc后,事件/消息流变得更加清晰。
我还应该注意,上游事件只会由IO-Thread触发,因此如果您使用ChannelUpstreamHandler
每ChannelPipeline
{{1}},则不需要在那里同步字段访问。任何线程都可以触发下游事件,因此需要同步对字段的访问。
答案 1 :(得分:1)
我认为这些想法来自网络堆栈。 Netty的处理程序 - 管道类比类似于OSI网络层堆栈。看一下OSI网络层的外观......
将每个处理程序视为“一层”,将整个管道视为“一个网络堆栈”,将物理链接视为“IO源”,将用户视为“应用程序逻辑处理程序”。使用相同的管道(堆栈),我们需要做两个功能
所以基本上相同的管道必须做两件事(接收消息并发回消息)。让我们考虑一个具体的例子(具有身份验证和加密的服务器),3个处理程序创建一个管道:
让我们看看每个接收消息的责任
UpstreamEvent
接收DownstreamEvent
。 UpstreamEvent
。UpstreamEvent
。因此,从逻辑上讲,每个处理程序都必须实现以下内容:
ChannelUpstreamHandler
和ChannelDownstreamHandler
ChannelUpstreamHandler
ChannelUpstreamHandler
所以如果你有一个ChannelPipeline
,上面提到了3个处理程序,
UpstreamEvent
,Netty会将UpstreamEvent
转发到(1)然后转移(2)然后转发(3),因为所有3个已经实现{ {1}}。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如何通过DownstreamEvent
和Downstream
解决发送和接收问题。我们如何在现实世界的应用程序中真正使用这些结构。
您的答案在此结束,有关额外内容,您可以在下面继续。
让我们看看每个转发消息的责任:
Upstream
)ctx.sendDownstream(e)
和ctx.sendDownstream(e)
)ctx.sendUpstream(e)
和ctx.sendDownstream(e)
)