当前位置: 首页 > news >正文

Netty+SpringBoot+FastDFS+Html5实现聊天App(六)

Netty+SpringBoot+FastDFS+Html5实现聊天App,项目介绍。

Netty+SpringBoot+FastDFS+Html5实现聊天App,项目github链接。

本章完整代码链接。

本章将给聊天App_PigChat加上心跳机制。



为什么要实现心跳机制

如果没有特意的设置某些选项或者实现应用层心跳包,TCP空闲的时候是不会发送任何数据包。也就是说,当一个TCP的socket,客户端与服务端谁也不发送数据,会一直保持着连接。这其中如果有一方异常掉线(例如死机、路由被破坏、防火墙切断连接等),另一端如果没有发送数据,永远也不可能知道。这对于一些服务型的程序来说,是灾难性的后果,将会导致服务端socket资源耗尽

举个简单的例子,当我们因为特殊情况打开飞行模式 ,在处理完事件之后再关闭飞行模式,这时候如果再进入应用程序中,我们将以新的channel进入,但是之前的channel还是会保留。

因此,为了保证连接的有效性、及时有效地检测到一方的非正常断开,保证连接的资源被有效的利用,我们就会需要一种保活的机制,通常改机制两种处理方式:

1、利用TCP协议层实现的Keepalive;

2、自己在应用层实现心跳包。



实现心跳机制

新建一个HeartBeatHandler用于检测channel的心跳。

继承ChannelInboundHandlerAdapter,并重写其userEventTriggered方法。当客户端的所有ChannelHandler中4s内没有write事件,则会触发userEventTriggered方法。

首先我们判断evt是否是IdleStateEvent的实例,IdleStateEvent用于触发用户事件,包含读空闲/写空闲/读写空闲。

对evt进行强制履行转换后,通过state判断其状态,只有当其该channel处于读写空闲的时候才将这个channel关闭。

/**
 * @Description: 用于检测channel的心跳handler 
 *                  继承ChannelInboundHandlerAdapter,从而不需要实现channelRead0方法
 */
public class HeartBeatHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        
        // 判断evt是否是IdleStateEvent(用于触发用户事件,包含 读空闲/写空闲/读写空闲 )
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent)evt;        // 强制类型转换
            
            if (event.state() == IdleState.READER_IDLE) {
                System.out.println("进入读空闲...");
            } else if (event.state() == IdleState.WRITER_IDLE) {
                System.out.println("进入写空闲...");
            } else if (event.state() == IdleState.ALL_IDLE) {
                
                System.out.println("channel关闭前,users的数量为:" + ChatHandler.users.size());
                
                Channel channel = ctx.channel();
                // 关闭无用的channel,以防资源浪费
                channel.close();
                
                System.out.println("channel关闭后,users的数量为:" + ChatHandler.users.size());
            }
        }
        
    }
    
}



增加心跳支持

在原来的WSServerInitialzer中增加心跳机制的支持。

        
        // ====================== 增加心跳支持 start    ======================
        // 针对客户端,如果在1分钟时没有向服务端发送读写心跳(ALL),则主动断开
        // 如果是读空闲或者写空闲,不处理
        pipeline.addLast(new IdleStateHandler(8, 10, 12));
        // 自定义的空闲状态检测
        pipeline.addLast(new HeartBeatHandler());
        // ====================== 增加心跳支持 end    ======================
        
        

相关文章:

  • 什么是API网关 如何设计亿万级统一网关
  • React的组件模式
  • passportjs 源码分析
  • Google Play 下架 App 之后的替身制作
  • 安卓应用性能调试和优化经验分享
  • Redis 懒删除(lazy free)简史
  • vue全家桶+Koa2开发笔记(8)--开发网页
  • Mycat - 实现数据库的读写分离与高可用
  • 理解 JavaScript 中的 this
  • 块级、内联、内联块级
  • Spring Boot 运作原理
  • 虚拟机网络不通故障解决
  • 原型模式深入探讨-【设计模式4】
  • 撕掉普通程序员的标签,这才是真正的大数据工程师!
  • Spring基于XML方式配置事务
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaWeb(学习笔记二)
  • learning koa2.x
  • node学习系列之简单文件上传
  • PHP变量
  • PHP的Ev教程三(Periodic watcher)
  • spring security oauth2 password授权模式
  • 大型网站性能监测、分析与优化常见问题QA
  • 搞机器学习要哪些技能
  • 猴子数据域名防封接口降低小说被封的风险
  • 跳前端坑前,先看看这个!!
  • 我与Jetbrains的这些年
  • 线上 python http server profile 实践
  • 学习ES6 变量的解构赋值
  • 一个完整Java Web项目背后的密码
  • 正则与JS中的正则
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (3)选择元素——(17)练习(Exercises)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (三)mysql_MYSQL(三)
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)Java算法:二分查找
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 无限分类
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ C++ ] STL---string类的模拟实现
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [CISCN 2019华东南]Web11
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)