解决 JS WebSocket 心跳检测 重连

news/2024/9/18 14:59:27/ 标签: javascript, websocket

解决 JS WebSocket 心跳检测 重连

在这里插入图片描述

文章目录

      • 解决 JS WebSocket 心跳检测 重连
        • 一、WebSocket 心跳检测的作用
        • 二、心跳检测的处理方案
          • 1. 创建 WebSocket 连接
          • 2. 心跳参数设置
          • 3. 心跳检测逻辑
          • 4. 心跳包响应处理
          • 5. 断线重连机制
        • 三、总结

一、WebSocket 心跳检测的作用

WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。然而,由于网络条件、防火墙设置或服务器配置等因素,WebSocket 连接可能会因为长时间没有数据传输而被认为是非活跃的,进而被关闭。为了保持连接的稳定性和可靠性,WebSocket 心跳检测机制显得尤为重要。其主要作用包括:

  1. 保持连接活跃:通过定期发送心跳包,可以确保 WebSocket 连接保持活跃状态,避免因长时间无数据传输而被网络设备或防火墙关闭。
  2. 检测连接状态:心跳包的发送和接收可以实时检测连接的状态。如果服务器没有响应心跳包,客户端可以判断连接可能已经断开,并采取相应的处理措施,如重新连接或显示错误信息。
  3. 减少资源浪费:通过心跳机制,可以及时关闭无效的连接,减少服务器资源的浪费。

二、心跳检测的处理方案

在 JavaScript 中,实现 WebSocket 心跳检测主要涉及到前端定时发送心跳包和检测服务器的响应。以下是一个详细的处理方案:

1. 创建 WebSocket 连接

首先,需要创建一个 WebSocket 连接。

javascript">const socket = new WebSocket('ws://your-websocket-server');
2. 心跳参数设置

定义心跳间隔和心跳超时时间。

javascript">const heartbeatInterval = 30 * 1000; // 心跳间隔为30秒
const heartbeatTimeout = 60 * 1000; // 心跳超时时间为60秒
3. 心跳检测逻辑

通过 JavaScript 的 setIntervalsetTimeout 函数来实现心跳检测逻辑。

javascript">let heartbeatIntervalId, heartbeatTimeoutId;// 心跳检测启动函数
function startHeartbeat() {heartbeatIntervalId = setInterval(function() {socket.send('ping'); // 发送心跳包// 重置心跳超时定时器clearTimeout(heartbeatTimeoutId);heartbeatTimeoutId = setTimeout(function() {console.log('Heartbeat timeout, closing the connection.');socket.close(); // 超时未收到响应,关闭连接// 这里可以添加重新连接的逻辑}, heartbeatTimeout);}, heartbeatInterval);
}// WebSocket 连接打开时启动心跳检测
socket.onopen = function() {console.log('WebSocket connection established.');startHeartbeat();
};// 收到服务器消息时处理
socket.onmessage = function(event) {// 判断是否为心跳响应(如pong消息)if (isPongMessage(event.data)) {// 重置心跳超时定时器clearTimeout(heartbeatTimeoutId);// 如果需要,可以再次启动心跳定时器(在某些实现中可能不需要)} else {// 处理其他消息}
};// 判断消息是否为pong消息
function isPongMessage(message) {return message === 'pong';
}// 连接关闭时清除定时器
socket.onclose = function() {console.log('WebSocket connection closed.');clearInterval(heartbeatIntervalId);clearTimeout(heartbeatTimeoutId);// 可以添加重新连接的逻辑
};// 处理错误
socket.onerror = function(error) {console.error('WebSocket error:', error);// 处理错误,例如重新连接
};

4. 心跳包响应处理

在服务器端,需要配置以响应客户端发送的心跳包。当服务器收到心跳包(如 'ping')时,应回复一个心跳响应(如 'pong')。

5. 断线重连机制

为了进一步增强连接的稳定性,可以在连接关闭时(onclose 事件触发时)添加自动重连的逻辑。这可以通过递归调用创建 WebSocket 连接的函数或使用第三方库(如 ReconnectingWebSocket)来实现。

javascript">function reconnect() {setTimeout(function() {// 重新创建 WebSocket 连接socket = new WebSocket('ws://your-websocket-server');// 重新绑定事件处理函数socket.onopen = function() { ... };socket.onmessage = function(event) { ... };socket.onclose = function() { ... };socket.onerror = function(error) { ... };// 启动心跳检测startHeartbeat();}, 1000); // 延迟1秒重连,避免过于频繁
}// 在 onclose 中添加重连逻辑
socket.onclose = function() {console.log('WebSocket connection closed. Attempting to reconnect...');reconnect();
};
三、总结

通过心跳检测机制,JavaScript WebSocket 应用能够保持连接的稳定性和可靠性。通过定期发送心跳包并检测服务器的响应,可以及时发现并解决连接问题,确保数据的实时传输。同时,通过实现断线重连机制,可以进一步提升用户体验和应用的健壮性。


http://www.ppmy.cn/news/1516812.html

相关文章

Kafka篇之清理或创建topic

1. kafka清理topic主题 清理topic步骤: step1: ./kafka-topics.sh --bootstrap-server 10.143.167.41:9092,10.143.167.42:9092,10.143.167.43:9092 --delete --topic reflow_data_topic请注意,如果 Kafka 的配置中没有设置 delete.topic.e…

SpringBoot日常:集成代码覆盖率测试工具JaCoCo

文章目录 简介开始集成1、pom添加依赖2、pom添加插件3、业务代码4、单元测试代码5、开始测试6、查看结果 如何排除不需要的路径?设置覆盖率目标并验证JACOCO的不足JACOCO改进版super-Jacoco代码覆盖率的知识扩展 简介 JaCoCo(Java Code Coverage&#x…

mac苹果电脑搭建Python开发环境

公司的新电脑上要搭建Python的开发环境,由于给的是mac电脑,所以需要重新搭建python环境。 这里我首先考虑的还是miniconda。 由于官网下载太慢了,所以我选择从清华源下载:https://mirrors.tuna.tsinghua.edu.cn/anaconda/minico…

【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站,全国各地旅游网站)

目录: 系统简介: 关键技术介绍 2.1 PYTHON语言简介 2.2 MySql数据库 2.3 DJANGO框架 2.4 Hadoop介绍 2.5 Scrapy介绍 2.6 B/S架构 系统总功能结构设计 系统详细实现: 6系统测试 系统测试的目的 软件测试过程 测试用例 为什么选择…

EasyExcel 导入计算公式导出展示字符串问题(SUM)

导出自定义表单 结果遇到 SUM函数 时 没有算出结果,直接展示的函数字符串 处理思路 拦截公式字符串 : 将对应的cell 设置 setCellFormula 字符串公式 然后cell类型设置为 CellType.FORMULA 重新配置 这样就解决了问题。 注意先设置CellFormula 然…

线程同步机制封装类

基础知识 RAII RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”. 是一个用于管理资源(如内存、文件句柄、网络连接等)的编程范式在构造函数中申请分配资源,在析构函数中释放资源。因为C的…

模板-C++

模板可以让你编写通用的、可重用的代码&#xff0c;而无需对每种数据类型编写重复的代码。模板分为两种主要类型&#xff1a;函数模板和类模板。 类模板 #include <iostream> #include <string> using namespace std;template< typename T> class PrintfEv…

网络安全售前入门03——审计类产品了解

目录 1.前言 2.堡垒机介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 3.日志审计 3.1产品架构功能 3.2应用场景 3.3部署形式 3.4产品价值 3.5选型依据 后续 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统…

CodeQL 从零到精通第 3 部分:使用 CodeQL 进行安全研究

查询特定的库方法 在上一篇博文中,我们根据名称匹配函数调用、函数和方法调用,例如,在本[挑战](https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/#:~:text=Challenge 9—Find all functions with “command” as part of its name…

oc记录 - UIView.layer

UIView属性 layer 在 Objective-C 中&#xff0c;UIView 类有一个名为 layer 的属性&#xff0c;它返回一个 CALayer 对象。这个属性允许你直接操作视图的底层图形层&#xff0c;以便更精细地控制视图的外观和行为。 以下是 UIView 的 layer 属性的一些基本用法&#xff1a; …

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

在 FPGA 上实现以太网的“低级”指南

如今&#xff0c;我们日常的网络连接大多是通过无线方式进行的&#xff0c;因此很容易忘记以太网。但它仍然是一种有用的标准&#xff0c;是一个可靠的高吞吐量网络链接的好方法。为此&#xff0c;[Robert Feranec] 和 [Stacy Rieck] 编写了一个关于如何在 FPGA 上使用以太网的…

【Mysql】通过Keepalived搭建mysql双主高可用集群

一、环境信息 主机名ip操作系统mysql版本VIP&#xff08;虚拟ip&#xff09;hadoop01192.168.10.200centos7_x865.7192.168.10.253hadoop03192.168.10.202centos7_x865.7 二、mysql集群搭建 两台节点&#xff0c;如果未部署mysql服务&#xff0c;部署文档请看【Mysql】mysql…

模型 PMI思考法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。全面评估&#xff0c;三思而后行。 1 PMI思考法的应用 1.1 个人职业发展中的PMI思考法应用 张华是一位有志于提升自己职业竞争力的职场人士。他正在考虑报名参加一个专业认证课程&#xff0c;以期提…

在我的博士科研生活中,SCI的英语写作一直是我的挑战。

在我的博士科研生活中&#xff0c;SCI的英语写作一直是我的挑战。尽管我不断地努力提高自己的语言水平&#xff0c;但每当我提交文章后&#xff0c;审稿人或编辑总是会指出语言表达的不足之处&#xff0c;让我深感苦恼。于是&#xff0c;我开始寻找专业的润色服务来帮助我提升文…

python如何判断回文

打开JUPTER NOTEBOOK&#xff0c;新建一个PYTHON文档。 n input("Please input string: ") print(n) 我们首先让用户输入要进行判断的字符串&#xff0c;然后打印出来查看一下。 n input("Please input string: ") is_palidrome n[::-1] if n is_palid…

单片机中的存储器讲解

单片机中的存储器 目录 单片机中的存储器常用的存储器易失性存储器RAMSRAMDRAM 非易失性存储器ROMMask ROMPROMEPROME2PROMFlashNOR FlashNADN Flash 单片机里全局变量、局部变量、堆、栈的存储区域区域介绍栈区堆区静态区代码区常量区 内存分区分类四个区域 常用的存储器 易失…

QT常用UI控件

目录 一、引言 二、QT常用UI控件概述 1.按钮&#xff08;QPushButton&#xff09; 2.文本框&#xff08;QLineEdit&#xff09; 3.标签&#xff08;QLabel&#xff09; 4.下拉列表&#xff08;QComboBox&#xff09; 5.单选按钮&#xff08;QRadioButton&#xff09; 6.复选框…

【OpenCV】SIFT(尺度不变特征变换)算法?

关键词&#xff1a;SIFT Algorithm 文章目录 一、介绍二、什么是 SIFT 算法&#xff1f;2.1 SIFT 算法描述2.2 SIFT 算法示例 三、人类与机器识别3.1 SIFT 在计算机视觉中的应用3.2 SIFT 关键点的优势3.3 示例演示 四、关键点定位关键点选择 五、实验任务指导5.1 计算大小和方…

博弈论详解 2(SG函数 和 SG定理)

传送门&#xff1a;博弈论详解 1&#xff08;基本理论定义 和 Nim 游戏&#xff09; 什么是 SG 函数 接着上次的讲解&#xff0c;我们来了解一个更通用的模型。我们把每一个状态变成一个点&#xff08;在 Nim 游戏里就代表 a a a 数组&#xff09;&#xff0c;如果可以从一种…