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 }