Netty入门(九)空闲连接以及超时
检测空闲连接和超时是为了及时释放资源。常见的方法是发送消息来测试一个不活跃的连接,通常称为“心跳”。
Netty 提供了几个 ChannelHandler 来实现此目的,如下:
下面是 IdleStateHandler 的一个简单使用:
1 /** 2 * 空闲连接 3 * 当超过60s没有数据收到时,就发送心跳到远端 4 * 如果没有回应,关闭连接 5 */ 6 public class IdleStateHandlerInitializer extends ChannelInitializer<Channel> { 7 8 @Override 9 protected void initChannel(Channel ch) throws Exception { 10 ChannelPipeline pipeline = ch.pipeline(); 11 // 若60s没有收到消息,调用userEventTriggered方法 12 pipeline.addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS)); 13 pipeline.addLast(new HeartBeatHandle()); 14 } 15 16 public static final class HeartBeatHandle extends ChannelInboundHandlerAdapter { 17 private static final ByteBuf HEARTBEAT_SEQUENCE = Unpooled.unreleasableBuffer( 18 Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.UTF_8)); 19 20 @Override 21 public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 22 if(evt instanceof IdleStateEvent) { 23 // 发送心跳到远端 24 ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate()) 25 .addListener(ChannelFutureListener.CLOSE_ON_FAILURE); // 关闭连接 26 } else { 27 // 传递给下一个处理程序 28 super.userEventTriggered(ctx, evt); 29 } 30 } 31 } 32 33 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步