[Netty] Netty心跳检测
程序员文章站
2022-06-24 10:35:04
Netty进行心跳检测的方法有很多,本文主要介绍通过Netty提供的idleStateHandler完成心跳检测IdleStateHandlerIdleStateHandler是Netty提供的专门用于处理空闲状态的处理器三个参数:1. readerIdleTIme 表示多长时间没有读了,就会发送一个心跳检测包,检测是否还是连接状态2. readerIdleTime 表示多长时间没有写了,就会发送一个心跳检测包,检测是否还是连接状态3. allIdleTIme 表示多长时间没有读写了,就会...
Netty进行心跳检测的方法有很多,本文主要介绍通过Netty提供的idleStateHandler完成心跳检测
IdleStateHandler
IdleStateHandler是Netty提供的专门用于处理空闲状态的处理器
三个参数:
1. readerIdleTIme 表示多长时间没有读了,就会发送一个心跳检测包,检测是否还是连接状态
2. readerIdleTime 表示多长时间没有写了,就会发送一个心跳检测包,检测是否还是连接状态
3. allIdleTIme 表示多长时间没有读写了,就会发送一个心跳检测包,检测是否还是连接状态
new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS)
用于心跳检测的服务端代码
其核心在于
pipeline.addLast()
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;
import java.util.concurrent.TimeUnit;
public class MyServer {
public static void main(String[] args) throws InterruptedException {
// 创建两个线程组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO)) // 用于日志记录
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));
pipeline.addLast(new MyServiceHandler());
}
});
ChannelFuture future = bootstrap.bind(7000).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
自定义的事件处理handler
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;
public class MyServiceHandler extends ChannelInboundHandlerAdapter {
/**
* @param ctx 上下文
* @param evt 事件
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
// 将evt转型
IdleStateEvent event = (IdleStateEvent) evt;
String eventType = null;
switch (event.state()) {
case READER_IDLE:
eventType = "读空闲";
break;
case WRITER_IDLE:
eventType = "写空闲";
break;
case ALL_IDLE:
eventType = "读写空闲";
break;
default:
break;
}
System.out.println(ctx.channel().remoteAddress() + "--- 超时时间---" + eventType);
}
}
}
以上一个Netty的心跳检测就完成了
使用客户端连接可以得到以上结果
/127.0.0.1:5394--- 超时时间---写空闲
/127.0.0.1:5394--- 超时时间---读空闲
/127.0.0.1:5394--- 超时时间---读写空闲
另外
在实际项目总,可以使用以上检测完成对于客户端的监控,当发现客户端超过一定时间没有进行读写操作时。进行数据库的更改或其他处理
本文地址:https://blog.csdn.net/GxDong_/article/details/112296936
推荐阅读