ChannelPipeline是Netty中很是核心的概念。每一个Netty SocketChannel包含一个ChannelPipeline。markdown
ChannelPipeline包含ChannelHandler实例的list。当数据移入和移出SocketChannel时,将调用这些ChannelHandler实例。数据结构
ChannelHandler接口具备两个子接口:ide
能够将ChannelInboundHandler和ChannelOutboundHandler实例都添加到Netty ChannelPipeline。编码
从SocketChannel接收到数据后,该数据将传递到ChannelPipeline中的第一个ChannelInboundHandler。此ChannelInboundHandler处理数据,而后将数据传递到ChannelPipeline中的下一个ChannelInboundHandler。3d
实际上,ChannelInboundHandler能够在将接收到的数据传递到管道中的下一个处理器以前对其进行转换。例如,原始的字节能够转换为HTTP对象或其余一些对象。而后,管道中的下一个处理器将看到HTTP对象,而非原始数据。netty
当将数据写回到SocketChannel时,它以相同方式发生。数据从ChannelOutboundHandler传递到ChannelPipeline中的ChannelOutboundHandler,直到到达SocketChannel。 ChannelOutboundHandler实例还能够转换流程中的数据。对象
尽管该图将ChannelInboundHandler和ChannelOutboundHandler实例显示为单独的列表,但它们实际上位于同一list(管道)中。blog
Netty编解码器对象实际上只是一个(或两个)ChannelHandler实现。编解码器一般由将请求字节转换为对象的ChannelInboundHandler实现和将响应对象转换为字节的ChannelOutboundHandler组成。接口
Netty随附了几种不一样协议的编解码器,例如HTTP,WebSocket,SSL / TLS等。为了将这些协议与Netty一块儿使用,您必须将相应的协议编解码器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中协议。事件
pipeline在建立Channel的时候被建立
Pipeline节点数据结构: ChannelHandlerContext
看看其一个实现类
基本数据结构组件
Pipeline中的两大哨兵: head和tail
先看看用户代码
判断是否重复添加
同理之后的过程
最佳实践
调用 pipeline 添加节点时,netty 会使用 instanceof 关键字判断当前节点是 inboound 仍是 outbound 类型,分别用不一样的 boolean 类型变量标识
inbound 事件类型顺序正相关
outbound 逆相关 异常处理器要么从 head 或者 tail 节点开始传播 inbound事件则从当前节点开始传递到最后节点 outbound事件则从当前节点开始传递 到第一个 outbound节点