解决 JS WebSocket 心跳检测 重连

news2024/9/23 7:25:56

解决 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 连接。

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

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

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

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

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)来实现。

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.coloradmin.cn/o/2081582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计量校准企业的生产制造,具备什么实际的作用?

计量校准行业已经发展了几十年,从建国后成立的计量所,建立了计量规范,到如今百花齐放,各类机构不断涌出,可供企业选择的计量机构可谓是越来越多,那么实际意义上,计量校准企业的生产制造&#xf…

草莓成熟度检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

草莓成熟度检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

【ragflow】安装2:源码安装依赖

中文文档【ragflow】安装1: docker:失败官方说的成功 docker 安装的启动失败 重新来一遍,不会重新拉取: root@k8s-master-pfsrv:/home/zhangbin/perfwork/rag# cd ragflow/ root@k8s-master-pfsrv:/home/

基于数字孪生智慧机场建设方案(53页PPT)

方案介绍: 数字孪生技术是一种通过数字化方式创建物理实体的虚拟模型,并借助历史数据、实时数据以及算法模型,模拟、验证、预测、控制物理实体过程的技术手段。在智慧机场建设中,该技术通过构建机场的虚拟镜像,实现机…

软件设计师全套备考系列文章15 -- 数据库:规范化、控制功能、大数据

软考-- 软件设计师(15)-- 数据库:规范化、控制功能、大数据 文章目录 软考-- 软件设计师(15)-- 数据库:规范化、控制功能、大数据前言一、章节考点二、规范化三、数据库的控制功能四、大数据、数据仓库 前言…

深度解析HarmonyOS SDK实况窗服务源码,Get不同场景下的多种模板

HarmonyOS SDK实况窗服务(Live View Kit)作为一个实时呈现应用服务信息变化的小窗口,遍布于设备的各个使用界面,它的魅力在于将复杂的应用场景信息简洁提炼并实时刷新,在不影响当前其他应用操作的情况下,时…

车载通信框架--- 以太网重连Port口相关思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

C语言补习课

来源:黑马程序员 C语言常用占位符 1.%d 或 %i:用于输出有符号整数(int)。 2.%u:用于输出无符号整数(unsigned int)。 3.%f:用于输出浮点数(float或double&#xff09…

美学设计:重塑中国商业竞争力的关键驱动力,美学革命:中国商业竞争的新战场

​在中国经济发展的滚滚洪流中,一场悄无声息却又波澜壮阔的革命正在上演。这不是技术的革新,不是商业模式的颠覆,而是一场关乎感官、情感与价值观的美学革命。 长久以来,中国企业在全球市场竞争中扮演着"世界工厂"的角色,以价格优势和规模效应称雄。然而,随着国内市…

element el-popover组件 查看示例图片功能实现

el-popover查看示例图片 官网文档:element ui 用于vue2 和element plus 用于vue3 https://element.eleme.cn/#/zh-CN/component/popover http://element-plus.org/zh-CN/component/popover.html 常见属性 <el-popover :width"400" trigger"hover" pl…

大数据技术之Flume 企业开发案例——自定义 Source(9)

目录 自定义 Source 1&#xff09;介绍 2&#xff09;需求 3&#xff09;分析 4&#xff09;编码 5&#xff09;测试 自定义 Source 1&#xff09;介绍 Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型和格式的日志数据&#xff0c;包括 avr…

【Spring】Spring循环依赖的解决方案

【Spring】Spring循环依赖的解决方案 开篇词&#xff1a;干货篇&#xff1a;1.PostConstruct方法&#xff1a;2.构造函数注入和Setter方法注入&#xff1a;3.配置文件注明【允许存在循环引用】4.Lazy5.SpringUtil的getBean 我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下…

Swift concurrency 3 — 三种异步方式(@escaping closure, Combine, async/await)

直到现在为止&#xff0c;如果我们想要异步请求数据&#xff0c;应该说至少有三种方式&#xff1a; 传统的通过闭包&#xff08;escaping closure&#xff09;方式回调处理。通过Combine的发布者订阅者机制。通过async/await组合的方式。 采用哪种方式&#xff0c;还得因项目…

基于微信小程序音乐分享与交流平台---附源码95587

摘 要 随着移动互联网的普及&#xff0c;微信小程序作为一种轻量级的应用程序&#xff0c;正逐渐成为人们获取信息和服务的便捷渠道。为了给用户提供便捷、多样化的音乐分享和交流渠道&#xff0c;本文提出了—种基于微信小程序的音乐分享与交流平台的设计与实现方案。通过该平…

SqlServer还原数据库后,数据库显示受限制用户解决方法

SqlServer还原数据库后&#xff0c;数据库显示受限制用户解决方法: 1.打开SSMS。 2.选中连接的数据库&#xff0c;右击鼠标右键&#xff0c;点击属性 3.在属性对话框中选择选项 4.在该对话框的右边&#xff0c;找到【限制访问】,并且将其改为&#xff1a;【MULTI_USER】 5.点击…

1个月2万粉的AI职业头像号,1分钟速成超详细教程

大家好 今天要拆解的是一个**小红书的AI职业头像号博主&#xff0c;**博主使用了手绘的二次元风格头像&#xff0c;不到1个月&#xff0c;现在的粉丝数已经1.9万了&#xff0c;收藏点赞9万。 有图有真相&#xff1a; 一、账号作品分析 这个博主的账号都是图文笔记。使用AI制…

【Google Maps JavaScript API】Simple Click Events 详解

文章目录 一、Simple Click Events 简介1. 什么是 Simple Click Events&#xff1f;2. 为什么使用 Simple Click Events&#xff1f; 二、Simple Click Events 的实现1. 基本代码结构2. 设置地图样式3. 初始化地图 三、处理点击事件1. 为标记添加点击事件2. 中心改变事件 四、完…

【JAVA基础】抽象类

抽象类 引言抽象类 抽象方法 引言 ​ 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 …

【Google Maps JavaScript API】Geolocation功能实现用户位置定位

文章目录 一、什么是Geolocation&#xff1f;二、Geolocation的应用场景三、如何使用Geolocation功能1. 初始化地图2. 编写初始化地图的JavaScript代码3. 代码解析初始化地图创建定位按钮获取用户位置处理定位错误 4. 样式设置5. 运行示例 四、注意事项五、总结 Google Maps Ja…

【GIT】Idea中的git命令使用-全网最新详细(包括现象含义)

原文网址&#xff1a;【GIT】Idea中的git命令使用-全网最新详细&#xff08;包括现象含义&#xff09; 文章目录 **命令1&#xff1a;查看当前所处分支&#xff1a;****命令2&#xff1a;拉取最新代码&#xff1a;****命令3&#xff1a;切换分支&#xff1a;****命令4&#xff…