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 {@Overridepublic 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    ======================

Netty+SpringBoot+FastDFS+Html5实现聊天App(六)相关推荐

  1. Netty+SpringBoot+FastDFS+Html5实现聊天App

    Netty+SpringBoot+FastDFS+Html5实现聊天App github链接: https://github.com/ShimmerPig... 已将前端代码上传至github,修改a ...

  2. Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)

    Netty学习 Netty+SpringBoot+FastDFS+Html5实现聊天App,项目介绍:https://segmentfault.com/a/11... Netty+SpringBoot ...

  3. Netty+SpringBoot+FastDFS+Html5实现聊天App详解(四)

    Netty+SpringBoot+FastDFS+Html5实现聊天App,项目介绍. Netty+SpringBoot+FastDFS+Html5实现聊天App,项目github链接. 本章完整代码 ...

  4. 使用 jQuery Mobile 与 HTML5 开发 Web App (六) —— jQuery Mobile 内容格式

    今天开始, "使用 jQuery Mobile 与 HTML5 开发 Web App" 的系列文章将会继续,这次要介绍的是 jQuery Mobile 的内容格式部分,这也是 jQ ...

  5. 从无到有创建一个聊天App六-仿QQ号生成算法

    思考 当你注册QQ的时候,系统会给你生成一个唯一的数字账号.那么这个账号在后台是怎么生成的呢?当让实现方法有很多,可以直接生成一个随机数,然后查找该随机数有没有被注册过,若是没有,则生成成功,否则,重 ...

  6. 【SpringBoot框架篇】18.使用Netty加websocket实现在线聊天功能

    文章目录 1.简介 2.最终功能实现的效果图 2.1.pc端 2.2.移动端 3.实战应用 3.1.引入依赖 3.2.配置文件 3.3.测试demo 3.3.1.消息内容实体类 3.3.2.处理请求的 ...

  7. SpringBoot +WebSocket实现简单聊天室功能实例

    SpringBoot +WebSocket实现简单聊天室功能实例) 一.代码来源 二.依赖下载 三.数据库准备(sql) 数据库建表并插入sql 四.resources文件配置 application ...

  8. 使用 jQuery Mobile 与 HTML5 开发 Web App (十四) —— jQuery Mobile 方法下

    本文承接上文<使用 jQuery Mobile 与 HTML5 开发 Web App -- jQuery Mobile 方法上>,继续说明 jQuery Mobile 的方法,这部分内容主 ...

  9. 使用 jQuery Mobile 与 HTML5 开发 Web App (十三) —— jQuery Mobile 方法上

    本篇介绍的,是 jQuery Mobile 的方法.对比于 jQuery 方法可以实现 DOM 遍历,动画,Ajax 等各种丰富的操作,jQuery Mobile 的方法更像是 jQuery Mobi ...

  10. 使用 jQuery Mobile 与 HTML5 开发 Web App (十二) —— jQuery Mobile 页面事件与 deferred

    在系列的上一篇文章<使用 jQuery Mobile 与 HTML5 开发 Web App -- jQuery Mobile 事件详解>中,Kayo 介绍了除页面事件外的其他 jQuery ...

最新文章

  1. 用计算机计算教学反思,《用计算器计算》教学反思
  2. python字符串用法详解(str、下标、切片、查找、修改、判断)
  3. 浅析jQuery的链式调用 之 each函数
  4. ROS系统 参数的获取和设置
  5. 【项目实战课】基于ncnn框架与KL散度的8bit对称模型量化与推理实战
  6. 如何查看 JSP 和 Servlet 的版本
  7. JavaScript 操作 HTML DOM (文档对象模型) 相关知识点
  8. 【HDU - 2066】:一个人的旅行(Dijkstra算法)
  9. 对HashMap数据结构的理解——加载因子和初始容量
  10. react 更新input 默认值setfieldsvalue_值得收藏的React面试题
  11. 包邮送50本畅销书,涵盖数据库、Python、机器学习等!
  12. 有道词典Linux版下载安装
  13. mysql数据字典的通俗理解_MySQL关于数据字典的一个疑问
  14. 九度oj题目1341:艾薇儿的演唱会
  15. java布类型的常量,java数据类型;常量与变量;
  16. viewstate和session(转自博客园)
  17. GEO、TCGA数据下载慢 下载中断解决办法
  18. 冰刃(IceSword)的使用方法(基础篇)
  19. 文件管理之文件的逻辑结构
  20. java 引用数据类型Scanner类 Random类

热门文章

  1. Flutter动画系列之AnimatedWidget
  2. case when then else
  3. mysql 廖雪峰_讨论 - 廖雪峰的官方网站
  4. 为什么所请求的剪切操作失败_MIUI12.5上手体验:给操作系统做了点“加法”,为用户多加了层防护...
  5. Flink CDC 项目 GitHub star 破 2000,新增 Maintainer 成员
  6. 爬了7000+条内衣信息,只为探究妹纸们的偏好!
  7. 大脑构造图与功能解析_EXCEL函数中Indirect才是构造函数之王,其他函数只能靠边站...
  8. electron 读取文件夹内容_electron + jQuery +node.js 快速上手之实现写入文件、拖拽打开文件并读取内容的功能...
  9. android改变textview文字,如何在Android TextView中更改文本
  10. android textview api,Android API中文文档TextView