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

WebSocket实战之六心跳重连机制

一、前言

WebSocket应用部署到生产环境,我们除了会碰到因为经过代理服务器无法连接的问题(注:该问题可以通过搭建WSS来解决,具体配置请看 WebSocket实战之四WSS配置 ),另外一个问题就是外网环境不稳定经常会断开或者服务器重启或者网络中间服务器当发现一个长连接长时间没有传输数据会断开,今天我们来了解一下基于WebSocket如何做心跳重连。

二、PingPong

关于心跳包的格式,WebSocket协议RFC6455中有定义控制帧的格式.

Ping帧包含一个操作码  0x9,Pong帧包含一个操作码 0xA。

客户端发送Ping帧,服务端收到Ping帧后回一个响应Pong帧。

但是JavaScript 并没有API支持Ping、Pong帧,而后端JavaEE是有PingPong的支持,这是很奇怪的事情,那我们就通过自定义消息来定义心跳包。

三、一个包含心跳包服务端推送较完整的例子

1、SpringBoot端代码

对 WebSocket实战之五JSR356 这篇文章WebSocketServer类进行修改,配置一个定时器,每隔10秒定时发送当前时间,并且在onMessage事件中加上接收心跳包以及发送心跳包的代码,服务端对心跳处理相对简单。

注:需要使用一个容器将请求的Session保存起来并且使用static,否则在发送信息时拿不到原来的那个session对象。

2、前端JavaScript代码

说明:

1、所有异常都加上重连代码,包含创建WebSocket连接、onClose事件、onError事件。

2、在onOpen和onMessage启动心跳包发送。

3、心跳包发送方法设置两个延迟器一个用于发送心跳包,另外一个用于当服务端超时(如果服务端未超时会发送响应心跳包然后重新调用heartCheck将两个延迟器清空)关闭WebSocket连接。

4、重连代码时序:当服务端Down掉或网络断开超过一定时间serverTimeoutObj这个延迟器会执行,然后调用ws.close()关闭连接并且触发onClose事件,在onClose事件中会调用reconnect方法,而reconnect又会调用createWebSocket方法,createWebSocket去创建WebSocket连接,当创建异常时又会再调用reconnect,一直到能连接得上。

http://www.lryc.cn/news/181722.html

相关文章:

  • Webpack 基础入门以及接入 CSS、Typescript、Babel
  • postgresql-自增字段
  • SpringBoot中使用Servlet和Filter
  • Monkey命令
  • 力扣 -- 279. 完全平方数(完全背包问题)
  • 在将对象 => JSON格式时,无法序列化部分属性
  • 用python表格初级尝试
  • 【单片机】16-LCD1602和12864显示器
  • AUTOSAR从入门到精通-基于 CAN 总线的汽车发电机智能调节器(下)
  • Windows下Tensorflow docker python开发环境搭建
  • idea常用快捷键 idea搜索快捷键
  • Redis Cluster Gossip Protocol: MEET
  • TcpConnection的读写操作【深度剖析】
  • k8s面试题
  • OpenCV 4.x 版本的新特性都有哪些?
  • Redisson—分布式集合
  • 93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布
  • doris动态分区开启历史分区
  • Linux用户与权限(认知root用户、修改权限控制 - chmod、修改权限控制 - chown)
  • 处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl
  • 如何在Go中格式化字符串
  • C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
  • 接雨水问题
  • 小谈设计模式(9)—工厂方法模式
  • Android etc1tool之png图片转换pkm 和 zipalign简介
  • Spring Boot快速入门:构建简单的Web应用
  • JAVA 泛型、序列化和复制
  • 以太网基础学习(二)——ARP协议
  • 【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类
  • 嵌入式Linux应用开发-驱动大全-第一章同步与互斥③