录屏 音乐 摸鱼 压图
在Netty中,每个Channel都有且仅有一个ChannelPipeline与之对应。Pipeline本质上是一个双向链表,采用责任链模式组织,用于串行化地执行ChannelHandler。
ChannelPipeline内部维护了一个由ChannelHandlerContext节点构成的双向链表,链表头部称为head,尾部称为tail。每个ChannelHandlerContext都持有一个ChannelHandler实例,负责具体的I/O事件处理。
当创建Channel时,Netty会调用Channel的handler方法,并传入一个ChannelInitializer对象。在ChannelInitializer的initChannel方法中,开发者可以通过pipeline的addLast、addFirst等方法向链表插入自定义的ChannelHandler。
Handler的添加顺序直接决定事件传播顺序。入站事件(如读)从head向tail传播;出站事件(如写)从tail向head传播。因此,解码器通常被添加到链表前端(inbound),编码器则被添加到后端(outbound)。
无论是编码器还是解码器,都必须实现ChannelHandler接口。Netty内置了大量开箱即用的编解码器,例如LengthFieldBasedFrameDecoder、ProtobufEncoder等。开发者也可通过实现ChannelInboundHandler或ChannelOutboundHandler接口,自定义协议解析与组装逻辑。
当所有Handler添加完毕后,Netty会将它们封装成ChannelHandlerContext并组成双向链表。任何I/O事件都会以串行方式沿链表传播,确保线程安全与顺序一致性。