netty 心跳检测
服务器和客户端需要进行维护,netty提供了心跳检测机制
特殊代码标注
new LoggingHandler(LogLevel.INFO) // 日志级别添加,添加后netty会打印日志
readerIdleTime 读空闲事件 writerIdleTime写空闲时间 allIdleTime既没有读也没有写的时间
IdleStateHandler 处理空闲状态的时间检测,通过这个可以触发一个IdelStateEvent事件 ,当没有执行读写或者读写事件的时候就会触发。
IdleStateHandler 触发后 通过调用userEventTiggered 来进行业务处理
new IdleStateHandler(3,5,7, TimeUnit.SECONDS)
区分 IdleStateHandler handlerRemoved
IdleStateHandler 能够实时触发,可以在保持连接的时候,来检测到连接的一个状态。
handlerRemoved 只能检测服务关闭的过程。
最终通过自定义的handler 来触发心跳的事件 ,通过下一个pipline来处理
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 HeartBeatServer {
private final int prot = 9999;
public void run () throws Exception{
ServerBootstrap serverBootstrap = new ServerBootstrap();
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workGroup = new NioEventLoopGroup();
try{
serverBootstrap.group(bossGroup,workGroup)
.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));
//自定义pipline
pipeline.addLast( new MyselfHeartBeatHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(prot).sync();
channelFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
new HeartBeatServer().run();
}
}
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
public class MyselfHeartBeatHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
// 判断是否是 IdeState类型
if(evt instanceof IdleStateEvent){
IdleStateEvent event = (IdleStateEvent) evt;
String eventState =null;
switch (event.state()){
case ALL_IDLE:
eventState="读写空闲";
break;
case READER_IDLE:
eventState="读空闲";
break;
case WRITER_IDLE:
eventState="写空闲";
break;
}
System.out.println(ctx.channel().remoteAddress()+"发生"+eventState);
}
}
}
原文地址:https://www.cnblogs.com/chianw877466657/p/13087938.html
- 多线程编程:阻塞、并发队列的使用总结
- 多线程编程:多线程并发制单的开发记录【一】
- 如何使用线程锁来提高多线程并发效率
- 如何在分布式环境中同步solr索引库和缓存信息
- 如何在分布式环境中同步solr索引库和缓存信息
- Info模式下的隐形杀手(SpringMVC同时使用<mvc:resources.../>和FormattingConversionServiceFactoryBean时出现的问题)
- 关于web.xml3.0启动报错
- [机器学习]-[数据预处理]-中心化 缩放 KNN(一)
- 信息安全不可或缺应用交付 还需安全交付
- 一张图带你看懂区块链项目生态
- python环境的安装
- python爬虫抓取网易云音乐歌词
- 区块链学堂——“遇见”拜占庭将军
- NVIDIA把消费级显卡拒绝在数据中心门外
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 即学即用Kotlin - 协程
- redis学习(三)
- update影响行数使用不当造成的bug
- 基于React+Koa实现一个h5页面可视化编辑器-Dooring
- 使用Spring Boot DevTools优化你的开发体验
- 排序算法——一篇文章搞懂常用的排序算法
- 路径寻优
- Milvus 实战 | 基于 Milvus 的 CORD-19 论文检索引擎
- Laravel 8 新特性和功能优化速览
- Linux 搭建 我的世界(MC) 基岩版服务器
- 虚函数、析构函数、静态函数、多态
- 一日一技:pylint除了检查代码风格,还能做这件事情
- Manjaoro ifconfig问题
- 面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!
- 内网渗透 | 内网中的信息收集