并发编程 | Netty - [出站、入站机制]
@
§1 出站 & 入站
Netty 是通过由多个 Handler 组成的链处理所有通信的
多个 Handler 组成的链即 Pipeline
Handler 本身是具有方向的,通常认为以 读 为处理重点的是 入站,以 写 为处理重点的是 出站
如下图

如何理解出站 & 入站
- 概括的讲
- 从当前程序端发出的是 出站,通常需要写
- 进入当前程序端的是 入站,通常需要读
 
- 出站、入站是一个相对的概念,随程序端的不同而变化
- 站在 Client,Client -> Server 是 ==出站 ==
- 站在 Server,Server -> Client 是 出站
 
- 并不是 S->C 是出站、C->S 是入站
如下图所示

出站 & 入站的影响
- 经过不同方向的 Handler- 出站需要经过 OutBoundHandler
- 入站需要经过 InBoundHandler
 
- 出站需要经过 
- 不同的编解码需求
- 出站通常需要编码
- 入站通常需要解码
 
§2 Pipeline & ChannelPipeline
作用
- 作为 Handler 的集合,负责处理、拦截出入站 IO 事件
- 很类似过滤器栈,责任链模式
- 可以完全控制 IO 事件的处理方式,并控制各个 ChannelHandler如何相互调用
结构
- 每个 Channel都有且仅有一个Pipeline
 二者关系参考 并发编程 | Netty - [Reactor 模型]
- ChannelPipeline本质上是一个双向链表
- 链表的节点类型是 ChannelHandlerContext,ChannelHandlerContext内部是ChannelHandler
- 通常不同 Pipeline中的ChannelHandler不共享
 技术上是可以做到共享的,但是一旦共享就需要处理线程安全问题,影响性能
- 入站、出站的 ChannelHandler在同一个链表中,但不会互相影响,Handler 与当前操作不符时会直接放行

常用方法
头部追加 Handler
addFirst()
尾部追加 Handler
addLast()
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号