Netty Channel 生命周期
建立连接流程
当一个新的连接建立时,ChannelHandler 中的方法按照以下顺序执行:
handlerAdded() → channelRegistered() → channelActive()
handlerAdded() - 当 Handler 被添加到 ChannelPipeline 中时调用,表示该 Handler 已经成功加入到处理链中。
channelRegistered() - 当 Channel 注册到 EventLoop(NioEventLoop)时调用,表示 Channel 已经与 NIO 线程建立了绑定关系。
channelActive() - 当 Channel 完全激活,可以进行读写操作时调用,标志着连接已经建立并处于活跃状态。
在Netty中,Handler被添加到Pipeline时、Channel注册到EventLoop时、Channel真正激活连接建立完成时这三个阶段分别对应不同的生命周期方法,它们体现了Netty从初始化到连接建立的完整过程。以下是详细解释:
Handler被添加到Pipeline时调用
当使用pipeline.addLast(new MyHandler())等方法将Handler添加到ChannelPipeline中时,会触发handlerAdded()方法。这个阶段Handler只是被加入到处理链中,但还没有与具体的Channel实例关联,更没有建立网络连接。这个阶段主要完成Handler的初始化和配置工作。
Channel注册到EventLoop时调用
当Channel通过bind()或connect()方法创建并注册到EventLoop时,会触发channelRegistered()方法。此时Channel已经与EventLoop线程绑定,可以开始监听I/O事件,但连接本身还未建立。这个阶段是连接建立前的准备工作,Channel已经准备好接收网络事件。
Channel真正激活连接建立完成时调用
当TCP连接真正建立完成,Channel处于可读写状态时,会触发channelActive()方法。这是连接建立的最终确认点,表示连接已经完成,可以进行数据传输。此时客户端已经成功连接到服务端,或者服务端已经接受了一个客户端连接。
这三个阶段构成了Netty连接建立的完整生命周期,每个阶段都有其特定的含义和作用,开发者需要根据不同的阶段来执行相应的业务逻辑。
java
public class MyHandler extends ChannelInboundHandlerAdapter {
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
// Handler被添加到Pipeline时调用
// 此时Handler已经加入处理链,但连接还未建立
System.out.println("Handler被添加到Pipeline");
}
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
// Channel注册到EventLoop时调用
// Channel已经与EventLoop绑定,可以监听I/O事件
System.out.println("Channel注册到EventLoop");
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// Channel真正激活连接建立完成时调用
// 连接已经建立,可以进行数据传输
System.out.println("连接建立完成");
}
}
这种分阶段的设计使得Netty能够精确控制网络连接的各个状态,为开发者提供了清晰的事件处理机制。
处理数据流程
在数据读取过程中,会依次触发:
channelRead() → channelReadComplete()
channelRead() - 当接收到新数据时调用,处理具体的业务逻辑。
channelReadComplete() - 批量读取操作完成后调用,通常用于刷新缓冲区。
关闭连接流程
当连接关闭时,方法按照相反顺序执行:
channelInactive() → channelUnregistered() → handlerRemoved()
channelInactive() - 当 Channel 失去连接或变为非活跃状态时调用,表示连接已经断开。
channelUnregistered() - 当 Channel 从 EventLoop 注销时调用,表示 Channel 已经不再与 NIO 线程绑定。
handlerRemoved() - 当 Handler 从 ChannelPipeline 中移除时调用,表示该 Handler 已经从处理链中移除。
这种分阶段的生命周期管理确保了Netty能够精确控制网络连接的各个状态,为应用层提供了清晰的事件处理机制。