Netty IdleStateHandler心跳机制
心跳机制
心跳是在 TCP 长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制;
在服务器和客户端之间一定时间内没有数据交互时,即处于 idle 状态时,客户端或服务器会发送一个特殊的数据包给对方,当接收方收到这个数据报文后,也立即发送一个特殊的数据报文,回应发送方,此即一个 PING-PONG 交互。自然地,当某一端收到心跳消息后,就知道了对方仍然在线,这就确保 TCP 连接的有效性。
心跳实现
使用 TCP 协议层的 Keeplive 机制,但是该机制默认的心跳时间是2小时,依赖操作系统实现不够灵活;
应用层实现自定义心跳机制,比如 Netty 实现心跳机制。
IdleStateHandler 心跳检测实例
服务端
服务端添加 IdleStateHandler 心跳检测处理器,并添加自定义处理 Handler 类实现 userEventTriggered() 方法作为超时事件的逻辑处理;
设定 IdleStateHandler 心跳检测每五秒进行一次读检测,如果五秒内 ChannelRead() 方法未被调用则触发一次 userEventTrigger() 方法;
ServerBootstrap b= new ServerBootstrap();
b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,1024)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline()
.addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));
socketChannel.pipeline().addLast(new StringDecoder());
socketChannel.pipeline().addLast(new HeartBeatServerHandler());
}
});
自定义处理类 Handler 继承 ChannlInboundHandlerAdapter,实现其 userEventTriggered() 方法,在出现超时事件时会被触发,包括读空闲超时或者写空闲超时。
class HeartBeatServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
throws Exception {
if (evt instanceof IdleStateEvent){
IdleStateEvent event = (IdleStateEvent) evt;
if (event.state() == IdleState.READER_IDLE){
// ...
}
} else {
super.userEventTriggered(ctx,evt);
}
}
}
客户端
This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content