Netty ChannelHandler的生命周期
ChannelHandler方法的执行是有顺序的,而这个执行顺序可以被称为ChannelHandler的生命周期。
LifeCyCleTestHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelHandlerContext; public class LifeCyCleTestHandler extends ChannelInboundHandlerAdapter { // handlerAdded():指当检测到新连接之后,调用ch.pipeline().addLast(new LifeCyCleTestHandler());之后的回调, // 表示在当前Channel中,已经成功添加了一个Handler处理器。 @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println( "逻辑处理器被添加: handlerAdded()" ); super .handlerAdded(ctx); } // channelRegistered():这个回调方法表示当前Channel的所有逻辑处理已经和某个NIO线程建立了绑定关系, // 接收新的连接,然后创建一个线程来处理这个连接的读写,只不过在Netty里使用了线程池的方式,只需要从线程池里去抓一个线程绑定在这个Channel上即可。 // 这里的NIO线程通常指NioEventLoop。 @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { System.out.println( "channel绑定到线程(NioEventLoop): channelRegistered()" ); super .channelRegistered(ctx); } // channelActive():当Channel的所有业务逻辑链准备完毕(即Channel的Pipeline中已经添加完所有的Handler), // 以及绑定好一个NIO线程之后,这个连接才真正被激活,接下来就会回调到此方法。 @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println( "channel准备就绪: channelActive()" ); super .channelActive(ctx); } // channelRead():客户端向服务端发送数据,每次都会回调此方法,表示有数据可读。 @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println( "channel有数据可读: channelRead()" ); super .channelRead(ctx, msg); } // channelReadComplete():服务端每读完一次完整的数据,都回调该方法,表示数据读取完毕。 @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { System.out.println( "channel某次数据读完: channelReadComplete()" ); super .channelReadComplete(ctx); } // channelInactive():表面上这个连接已经被关闭了,这个连接在TCP层面已经不再是ESTABLISH状态了。 @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.out.println( "channel被关闭: channelInactive()" ); super .channelInactive(ctx); } // channelUnregistered():既然连接已经被关闭,那么与这个连接绑定的线程就不需要对这个连接负责了。这个回调表明与这个连接对应的NIO线程移除了对这个连接的处理。 @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { System.out.println( "channel取消线程(NioEventLoop)的绑定: channelUnregistered()" ); super .channelUnregistered(ctx); } // handlerRemoved():我们给这个连接添加的所有业务逻辑处理器都被移除。 @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { System.out.println( "逻辑处理器被移除: handlerRemoved()" ); super .handlerRemoved(ctx); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!