姚同学 录屏 音乐 摸鱼 压图
Netty通信

NettyPipeline概述

在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添加顺序与执行顺序

Handler的添加顺序直接决定事件传播顺序。入站事件(如读)从head向tail传播;出站事件(如写)从tail向head传播。因此,解码器通常被添加到链表前端(inbound),编码器则被添加到后端(outbound)。

编解码器实现

无论是编码器还是解码器,都必须实现ChannelHandler接口。Netty内置了大量开箱即用的编解码器,例如LengthFieldBasedFrameDecoder、ProtobufEncoder等。开发者也可通过实现ChannelInboundHandler或ChannelOutboundHandler接口,自定义协议解析与组装逻辑。

双向链表与串行调用

当所有Handler添加完毕后,Netty会将它们封装成ChannelHandlerContext并组成双向链表。任何I/O事件都会以串行方式沿链表传播,确保线程安全与顺序一致性。