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.hqwc.cn/news/124692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows安装Docker并创建Ubuntu环境及运行神经网络模型

目录 前言在Windows上安装Docker在Docker上创建Ubuntu镜像并运行容器创建Ubuntu镜像配置容器,使其可以在宿主机上显示GUI 创建容器并运行神经网络模型创建容器随便找一个神经网络模型试试 总结 前言 学生党一般用个人电脑玩神经网络,估计很少有自己的服…

linux入门---信号的保存和捕捉

目录标题 信号的一些概念信号的保存pending表block表handler表 信号的捕捉内核态和用户态信号的捕捉 信号的一些概念 1.进程会收到各种各样的信号,那么程序对该信号进行实际处理的动作叫做信号的递达。 2.我们之前说过当进程收到信号的时候可能并不会立即处理这个信…

视频讲解|基于DistFlow潮流的配电网故障重构代码

目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容,对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路),对该程序进行了详尽的讲解,基本做到句句分析和讲解(讲解…

速看:免费领取4台阿里云服务器_申请入口及领取流程

注册阿里云账号,免费领云服务器,最高领取4台云服务器,每月750小时,3个月免费试用时长,可快速搭建网站/小程序,部署开发环境,开发多种企业应用。阿里云服务器网分享阿里云服务器免费领取入口、免…

最短路径专题5 最短路径

题目: 样例: 输入 4 5 0 2 0 1 2 0 2 5 0 3 1 1 2 2 3 2 2 输出 3 0->3->2 思路: 根据题目意思,求最短路,这个根据平时的Dijkstra(堆优化)即可,关键在于求路径的方法&#x…

STM32驱动步进电机

前言 (1)本章介绍用stm32驱动42步进电机,将介绍需要准备的硬件器材、所需芯片资源以及怎么编程及源代码等等。 (2)实验效果:按下按键,步进电机顺时针或逆时针旋转90度。 (3&#xff…

uniapp 事件委托失败 获取不到dataset

问题&#xff1a; v-for 多个span ,绑定点击事件 代码:view里包着一个span, <view class"status-list" tap"search"><span class"status-item" v-for"(key,index) in statusList" :key"index" :data-key"k…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

【机器学习】训练集/验证集/测试集释疑

文章目录 序言1. 训练集、验证集、测试集是什么2. 为什么需要验证集3. 验证集是必须的吗4. 验证集和测试集上的表现会不同吗5. 如何从Train/Test Set划分Validation Set6. 训练集、验证集和测试集的比例怎么设置7. 模型表现不好时测试集可以反复使用来调整模型吗8. 训练集、验证…

lv7 嵌入式开发-网络编程开发 07 TCP服务器实现

目录 1 函数介绍 1.1 socket函数 与 通信域 1.2 bind函数 与 通信结构体 1.3 listen函数 与 accept函数 2 TCP服务端代码实现 3 TCP客户端代码实现 4 代码优化 5 练习 1 函数介绍 其中read、write、close在IO中已经介绍过&#xff0c;只需了解socket、bind、listen、acc…

实战型开发--3/3,clean code

编程的纯粹 hmmm&#xff0c;一开始在这个环节想聊一些具体的点&#xff0c;其实也就是《clean code》这本书中的点&#xff0c;但这个就还是更流于表面&#xff1b; 因为编码的过程&#xff0c;就更接近于运动员打球&#xff0c;艺术家绘画&#xff0c;棋手下棋的过程&#x…

详解Linux的系统调用fork()函数

在Linux系统中&#xff0c;fork()是一个非常重要的系统调用&#xff0c;它的作用是创建一个新的进程。具体来说&#xff0c;fork()函数会在当前进程的地址空间中复制一份子进程&#xff0c;并且这个子进程几乎完全与父进程相同&#xff0c;包括进程代码、数据、堆栈以及打开的文…