![JAR search and dependency download from the Maven repository](/logo.png)
com.zhuang.netty.handler.heartbeat.HeartbeatClientHandler Maven / Gradle / Ivy
package com.zhuang.netty.handler.heartbeat;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@Slf4j
public class HeartbeatClientHandler extends ChannelInboundHandlerAdapter {
private static final ByteBuf HEARTBEAT_SEQUENCE = Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.UTF_8));
private static final int HEARTBEAT_INTERVAL_SECONDS = 10;
private ScheduledFuture> heartBeatTask;
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// 定时向服务器发送心跳消息
heartBeatTask = ctx.executor().scheduleAtFixedRate(
new HeartbeatTask(ctx), 0, HEARTBEAT_INTERVAL_SECONDS, TimeUnit.SECONDS);
super.channelActive(ctx);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
heartBeatTask.cancel(true);
super.channelInactive(ctx);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof ByteBuf && ((ByteBuf) msg).equals(HEARTBEAT_SEQUENCE)) {
// 收到服务器的心跳响应消息
log.info("Client receive heartbeat response");
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
if (heartBeatTask != null) {
heartBeatTask.cancel(true);
heartBeatTask = null;
}
ctx.fireExceptionCaught(cause);
}
private static class HeartbeatTask implements Runnable {
private final ChannelHandlerContext ctx;
public HeartbeatTask(ChannelHandlerContext ctx) {
this.ctx = ctx;
}
@Override
public void run() {
ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate());
log.info("Client send heartbeat");
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy