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

WebSocket心跳机制

WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

1、创建webSocket

// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');

2、websocket事件

事件事件处理程序描述
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose

连接关闭时触发

3、WebSocket方法

方法描述
Socket.send()使用连接发送数据
Socket.close()关闭连接

WebSocket的心跳机制

问题:

(1)websocket在连接后,如果长时间服务端和客户端不发消息,服务端会把websocket给断开。

(2)存在网络忽然断开的情况,这时服务器端并没有触发onclose的事件。服务器会继续向客户端发送多余的信息,这些数据会丢失。

心跳重连机制

为了解决上面的问题,就需要⼀种机制来检测客户端和服务端是否处于正常的连接状态。因此就有了websocket的心跳机制。

⼼跳机制是客户端每隔⼀段时间会向服务端发送⼀个数据包,告诉服务端自己还活着,同时客户端会根据服务端是否会回传⼀个数据包来确定服务端是否还活着。
如果客户端没有收到回复,表示websocket断开连接或者网络出现问题,就需要重连

const socket = new WebSocket('ws://localhost:8080'); // WebSocket 建立连接
const heartCheck = initHeartCheck();// 初始化心跳检测对象// WebSocket建立连接成功
socket.addEventListener('open', function (event) {heartCheck.start();// 启动心跳检测socket.send('Hello Server!');
});
// WebSocket接受到服务端消息
socket.addEventListener('message',function(event){heartCheck.start();// 启动心跳检测
})
// WebSocket 连接被关闭
socket.addEventListener('close',function(event){heartCheck.reset();// 启动心跳检测
})
// WebSocket 连接因错误而关闭
socket.addEventListener('error',function(event){heartCheck.reset();// 启动心跳检测
})function initHeartCheck() {return {timeout: 2 * 1000, // 每2s向服务端发送一次消息serverTimeout: 10 * 1000, // 10s收不到服务端消息算超时timer: null,serverTimer: null,reset() { // 心跳检测重置clearTimeout(this.timer);clearTimeout(this.serverTimer);this.timer = null;this.serverTimer = null;return this;},start() { // 心跳检测启动this.reset();this.timer = setTimeout(() => { socket.send('ping'); // 定时向服务端发送消息if (!this.serverTimer) {this.serverTimer = setTimeout(() => {// 关闭连接触发重连console.log(new Date().toLocaleString(), "not received pong, close the websocket");socket.close(); //关闭websocket或根据业务需求去重连 }, this.serverTimeout);}}, this.timeout);},}}

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

相关文章:

  • Form Generator 扩展子表单组件之表单校验(超详细)
  • HTTPS安全套接字层超文本传输协议
  • Jenkins发送的邮箱中没有带配置的压缩附件
  • VU3-02
  • Linux新手小程序——进度条
  • 会点C++还需要再学Python吗?
  • Ceph入门到精通- Linux 磁盘管理(block 与 inode)
  • 安全DNS,状态码,编码笔记整理
  • 【业务功能篇53】Springboot 数据封装对象
  • 将Spring Session存储到Redis中实现持久化
  • Git工作中常用命令
  • 【电路效应】信号处理和通信系统模型中的模拟电路效应研究(SimulinkMatlab代码实现)
  • Spring 的元注解
  • 【前缀和】238. 除自身以外数组的乘积
  • 【Java中间件】RocketMQ
  • Megatron-LM、NVIDIA NeMo、MegaMolBART 、model_optim_rng.pt 文件是什么?
  • 2023年信息系统项目管理师如何报名?老司机告诉你
  • linux ubuntu系统 命令备忘
  • 我的第一个flutter项目(Android Webview)
  • 微信机器人搭建详细教程
  • opengauss安装
  • 什么是SVM算法?硬间隔和软间隔的分类问题
  • Normalization(BN and LN) in NN
  • opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)
  • python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归
  • 聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法
  • 【机器学习】机器学习中的“本体”概念
  • ChatGPT是否能够进行对话中的参考和指代解析?
  • 网红项目AutoGPT源码内幕及综合案例实战(三)
  • 第八章:list类