关键词:
buffer channel handler Pipeline sink event Upstream Downstream
Netty的javadoc中的流程比较形象的介绍了netty中channel的消息机制:io.netty.channel.ChannelPipeline
I/O Request
via Channel or
ChannelHandlerContext
|
+---------------------------------------------------+---------------+
| ChannelPipeline | |
| \|/ |
| +---------------------+ +-----------+----------+ |
| | Inbound Handler N | | Outbound Handler 1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler N-1 | | Outbound Handler 2 | |
| +----------+----------+ +-----------+----------+ |
| /|\ . |
| . . |
| ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
| [ method call] [method call] |
| . . |
| . \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 2 | | Outbound Handler M-1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 1 | | Outbound Handler M | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
+---------------+-----------------------------------+---------------+
| \|/
+---------------+-----------------------------------+---------------+
| | | |
| [ Socket.read() ] [ Socket.write() ] |
| |
| Netty Internal I/O Threads (Transport Implementation) |
+-------------------------------------------------------------------+
Netty中对handler和event的处理机制大体过程如下:
1 一个channel对应一个ChannelPipeline,ChannelPipeline可以理解为一个容器,内部容纳一个一个的ChannelHandler,主要负责对ChannelHandler的调用。
2 各个ChannelHandler之间的通讯主要是依靠ChannelEvent,同时ChannelPipeline也依靠ChannelEvent调用各个ChannelHandler。
3 ChannelSink是处于末端的ChannelHandler,主要处理一些末端的操作建立连接、绑定端口等。
具体的原理在相关博客中已经讲的很清楚了: