概述

Netty提供了一个读写空闲心跳检测机制的Handler,用于检测读空闲、写空闲、读写空闲。
如果服务端在一定时间内没有执行读请求,就会触发读空闲事件,一定时间内没有执行写请求,就会触发写空闲事件,如果在一定时间内既没有执行读请求,也没有执行写请求,就会触发读写空闲事件。

案例

服务端:

public class NettyHeartBeatServer {private  int port;public NettyHeartBeatServer(int port){this.port = port;}public void start() throws InterruptedException {NioEventLoopGroup bossGroup = new NioEventLoopGroup();NioEventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//添加一个心跳检测机制的Handler,Netty自带的。//四个参数://readerIdleTime  读空闲时间,如果这个时间内没有执行读请求,就会触发读空闲事件//writerIdleTime  写空闲时间,如果这个时间内没有执行写请求,就会触发写空闲事件。//allIdleTime   读写空闲时间,如果在这个时间内没有执行读请,也没有执行写请求,就会触发读写空闲事件//unit    时间单位//这里设置的是 3秒读空闲、5秒写空闲、8秒读写空闲pipeline.addLast(new IdleStateHandler(3,5,8, TimeUnit.SECONDS));//触发空闲事件要由下一个InboundHandler的userEventTriggered方法解决,这里就直接写一个匿名类算了,不新建了。pipeline.addLast(new ChannelInboundHandlerAdapter(){@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {//强转IdleStateEvent stateEvent = (IdleStateEvent) evt;//IdleState是一个枚举类,包含了3中空闲状态switch (stateEvent.state()){case READER_IDLE:{System.out.println("客户端:" + ctx.channel().remoteAddress()+  "触发了读空闲事件");break;}case WRITER_IDLE:{System.out.println("客户端:" + ctx.channel().remoteAddress()+  "触发了写空闲事件");}case ALL_IDLE:{System.out.println("客户端:" + ctx.channel().remoteAddress()+  "触发了读写空闲事件");}}super.userEventTriggered(ctx, evt);}});}});ChannelFuture channelFuture = serverBootstrap.bind(port);channelFuture.channel().closeFuture().sync();}public static void main(String[] args) throws InterruptedException {NettyHeartBeatServer nettyHeartBeatServer = new NettyHeartBeatServer(8989);nettyHeartBeatServer.start();}
}

客户端:

//客户端 ,仅仅做连接,不发任何数据
public class NettyHeartBeatClient {private  int serverPort;public NettyHeartBeatClient(int serverPort){this.serverPort = serverPort;}public void start() throws InterruptedException {NioEventLoopGroup worker = new NioEventLoopGroup();Bootstrap bootstrap = new Bootstrap();bootstrap.group(worker).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {}});ChannelFuture connect = bootstrap.connect("127.0.0.1", serverPort);connect.channel().closeFuture().sync();}public static void main(String[] args) throws InterruptedException {NettyHeartBeatClient nettyHeartBeatClient = new NettyHeartBeatClient(8989);nettyHeartBeatClient.start();}
}

执行结果:

可以利用这些来维护空闲连接超时,比如60秒客户端没有数据发来,就把连接断开之类的。

Netty空闲心跳检测机制相关推荐

  1. Netty学习(七):心跳检测机制

    一.什么是心跳检测机制 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 心跳机制主要是客户端和服务端长时间连 ...

  2. Netty 心跳检测机制

    心跳检测机制 目的:就是用于检测 检测通信对方是否还"在线",如果已经断开,就要释放资源 或者 尝试重连. 大概的实现原理就是:在服务器和客户端之间一定时间内没有数据交互时, 即处 ...

  3. netty的编解码、粘包拆包问题、心跳检测机制原理

    文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...

  4. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接

    Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...

  5. Netty(八) Netty心跳检测机制

    1.什么是长链接和短链接 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接.当客户端浏览器访问的某个HTML或其他类型的Web页中 ...

  6. Netty心跳检测机制

    一.Netty心跳检测机制 心跳:即在 TCP 长连接中,客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保 TCP 连接的有效性. 在 Netty 中,实现心跳机制的关键是 I ...

  7. Netty教程07:心跳检测机制

    需求:编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,就提示写空闲 实现当服务器超过7秒没有读或者写操作时,就提示读写空闲 Server ...

  8. 【Netty】利用Netty实现心跳检测和重连机制

    一.前言 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制.   我们用到的很多框架都用到了心跳检测,比如服务注册到 Eureka Server 之后会维 ...

  9. netty 中的心跳检测机制

    为什么要心跳检测机制 当服务端接收到客户端的连接以后,与客户端建立 NioSocketChannel 数据传输的双工通道,但是如果连接建立以后,客户端一直不给服务端发送消息,这种情况下是占用了资源,属 ...

最新文章

  1. C语言中的关键字详略
  2. js设置div高度低于滚动高度时固定
  3. [Android] Git组件化部署
  4. 某站点下载资源自己主动评论器
  5. java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例
  6. 红橙Darren Android视频笔记 自定义view的三个构造方法以及一种实现换肤的方案 测量mode
  7. 详细的redis操作介绍
  8. UVA465 Overflow【大数】
  9. python matplotlib 保存图片失真_Python matplotlib线框失真
  10. linux导入多个文件到myql
  11. 投资20亿元,又一个云手机基地诞生
  12. Science子刊:利用DTI和NODDI纵向研究揭示轻度脑外伤后的白质微结构改变
  13. 济南职工医保统筹的一些了解
  14. 疯狂ios讲义之疯狂打飞机(2)
  15. 线性约束最小方差准则
  16. Hitting Set 碰撞集问题
  17. grep -s 去掉 no such file or directory
  18. Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so.
  19. 2,uniapp功能之—扫码(条形码,二维码)点击扫码或者pda侧边按钮扫码
  20. 3GPP: IMS视频码率自适应调整介绍

热门文章

  1. 在VsCode里编写和运行不同语言的程序
  2. 2020年Java实训项目【GUI学生信息管理系统】目录
  3. BestCoder Round #77 (div.2)解题报告
  4. 【codevs1052】地鼠游戏,标签不都是对的
  5. 2017.10.10 Perm 排列计数 失败总结
  6. 信号 移相 matlab,MATLAB中的SISOTOOL在数字式移相全桥中的应用
  7. SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(4)-算法实现1
  8. dict实现原理 python_5分钟看懂系列:Python 线程池原理及实现
  9. 485串口测试工具软件_(案例)电脑和仪表之间485通讯的奇怪现象及解决方案
  10. apex图表使用饼图居中_饼图若只有一个值的时候,normal.label.position='center'时,label居中指的是DOM居中而不是图表居中...