赶快收藏!全网最佳 WebSocket 封装:完美支持断网重连、自动心跳!

news2024/11/15 12:08:32

文章目录

    • 一、WebSocket 基础
      • WebSocket 的基本使用
    • 二、封装 WebSocket 客户端
      • WebSocketClient 类
      • 使用 WebSocketClient 类
      • 解释代码实现
    • 三、总结
      • 优点
      • 未来改进

在这里插入图片描述

🎉欢迎来到SpringBoot框架学习专栏~


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:SpringBoot
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在现代 Web 开发中,WebSocket 已成为实现实时通讯的常用技术。然而,直接使用 WebSocket API 时,开发者常常需要面对断网重连、心跳检测等问题,增加了开发难度和复杂度。本文将介绍一种封装后的 WebSocket 解决方案,不仅支持断网重连和自动心跳,还简化了使用流程,极大提升开发效率。

在这里插入图片描述

一、WebSocket 基础

WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。它是为了解决 HTTP 协议不能进行实时通讯而设计的,可以在不经过轮询的情况下实现浏览器与服务器的实时、双向通讯。

WebSocket 的基本使用

在原生 JavaScript 中,WebSocket 的使用非常简单:

const socket = new WebSocket('ws://example.com/socket');

// 连接成功时触发
socket.onopen = function(event) {
    console.log('Connection established');
};

// 接收到消息时触发
socket.onmessage = function(event) {
    console.log('Message received: ' + event.data);
};

// 连接关闭时触发
socket.onclose = function(event) {
    console.log('Connection closed');
};

// 连接发生错误时触发
socket.onerror = function(event) {
    console.error('WebSocket error: ' + event);
};

// 发送消息
socket.send('Hello Server!');

尽管 WebSocket 的 API 简洁易用,但它并不提供自动重连和心跳检测等功能。接下来,我们将封装一个 WebSocket 客户端,解决这些问题。

二、封装 WebSocket 客户端

我们的目标是封装一个支持断网重连和自动心跳的 WebSocket 客户端。以下是实现代码:

WebSocketClient 类

class WebSocketClient {
    constructor(url, options = {}) {
        this.url = url;
        this.reconnectDelay = options.reconnectDelay || 1000; // 重连间隔时间
        this.heartbeatInterval = options.heartbeatInterval || 5000; // 心跳间隔时间
        this.heartbeatMsg = options.heartbeatMsg || 'ping'; // 心跳消息
        this.ws = null;
        this.isConnected = false;
        this.heartbeatTimer = null;
        this.reconnectTimer = null;
    }

    connect() {
        this.ws = new WebSocket(this.url);

        this.ws.onopen = () => {
            this.isConnected = true;
            console.log('Connection established');
            this.startHeartbeat();
        };

        this.ws.onmessage = (event) => {
            console.log('Message received: ' + event.data);
            if (event.data === 'pong') {
                console.log('Heartbeat response received');
            }
        };

        this.ws.onclose = () => {
            this.isConnected = false;
            console.log('Connection closed');
            this.stopHeartbeat();
            this.reconnect();
        };

        this.ws.onerror = (event) => {
            console.error('WebSocket error: ' + event);
            this.ws.close();
        };
    }

    send(message) {
        if (this.isConnected) {
            this.ws.send(message);
        } else {
            console.error('WebSocket is not connected');
        }
    }

    startHeartbeat() {
        this.stopHeartbeat();
        this.heartbeatTimer = setInterval(() => {
            if (this.isConnected) {
                this.send(this.heartbeatMsg);
            }
        }, this.heartbeatInterval);
    }

    stopHeartbeat() {
        if (this.heartbeatTimer) {
            clearInterval(this.heartbeatTimer);
            this.heartbeatTimer = null;
        }
    }

    reconnect() {
        if (!this.isConnected) {
            console.log(`Reconnecting in ${this.reconnectDelay / 1000} seconds...`);
            this.reconnectTimer = setTimeout(() => {
                this.connect();
            }, this.reconnectDelay);
        }
    }

    close() {
        this.ws.close();
    }
}

使用 WebSocketClient 类

以下是如何使用 WebSocketClient 类的示例:

const wsClient = new WebSocketClient('ws://example.com/socket', {
    reconnectDelay: 2000,
    heartbeatInterval: 10000,
    heartbeatMsg: 'ping'
});

// 连接 WebSocket
wsClient.connect();

// 发送消息
document.getElementById('sendButton').addEventListener('click', () => {
    const message = document.getElementById('messageInput').value;
    wsClient.send(message);
});

// 关闭 WebSocket 连接
document.getElementById('closeButton').addEventListener('click', () => {
    wsClient.close();
});

解释代码实现

  1. 构造函数WebSocketClient 类的构造函数接受两个参数:WebSocket 服务器的 URL 和一个选项对象。选项对象允许我们设置重连间隔时间、心跳间隔时间和心跳消息。

  2. 连接方法connect 方法创建一个新的 WebSocket 连接,并设置 onopenonmessageoncloseonerror 事件处理程序。

  3. 发送消息send 方法用于发送消息。它首先检查 WebSocket 是否已连接。

  4. 心跳机制startHeartbeat 方法启动一个定时器,每隔一段时间发送一次心跳消息。stopHeartbeat 方法用于停止心跳定时器。

  5. 重连机制reconnect 方法在连接关闭后启动一个定时器,尝试重新连接 WebSocket 服务器。

  6. 关闭连接close 方法用于手动关闭 WebSocket 连接。

三、总结

本文介绍了一种封装后的 WebSocket 解决方案,完美支持断网重连和自动心跳。通过这种封装,我们可以在项目中更方便地使用 WebSocket,实现高效、可靠的实时通讯。

优点

  • 自动重连:在网络异常或服务器断开连接时,客户端会自动尝试重新连接,确保连接的稳定性。
  • 自动心跳:通过定期发送心跳消息,确保连接的活跃性,并能及时检测连接状态。
  • 简化使用:封装后的 WebSocket 客户端提供了简单的 API,使开发者能更轻松地实现即时通讯功能。

未来改进

  • 消息队列:在连接断开时,可以将消息保存到队列中,待重新连接后再发送,确保消息不丢失。
  • 错误处理:更细致的错误处理机制,例如对特定错误代码的处理。
  • 高级功能:支持更多高级功能,如加密通讯、消息压缩等。

通过这篇文章,希望你能更好地理解 WebSocket 的使用,并在项目中应用这套封装方案,提升开发效率和代码质量。赶快收藏这篇文章,实践一下吧!


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861232.html

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

相关文章

找不到mfc140u.dll怎么修复,mfc140u.dll丢失的多种修复方法

计算机丢失mfc140u.dll文件会导致依赖该文件的软件无法正常运行。mfc140u.dll是Microsoft Visual C 2015的可再发行组件之一,它属于Microsoft Foundation Class (MFC) 库,许多使用MFC开发的程序需要这个DLL文件来正确执行。丢失了mfc140u.dll文件。会导致…

论文阅读--《FourierGNN:从纯图的角度重新思考多元时间序列预测》

Yi K, Zhang Q, Fan W, et al. FourierGNN: Rethinking multivariate time series forecasting from a pure graph perspective[J]. Advances in Neural Information Processing Systems, 2024, 36. 本次介绍的文章来自NeurIPS 2023,关于多变量时间序列的预测 摘要…

以创新赋能引领鸿蒙应用开发,凡泰极客亮相华为HDC2024

6月21日至23日,华为开发者大会2024在松山湖举行。大会现场,华为发布了HarmonyOS、盘古大模型等方面最新进展。国内外众多企业齐聚一堂,共迎新商机、共创新技术、共享新体验。 凡泰极客作为鸿蒙生态的重要战略合作伙伴,同时也是鸿…

【 IM 服务】开通全量消息路由服务

前提条件 在生产环境中,仅 IM 旗舰版、IM 尊享版可开通该服务。 操作说明 控制台 - 应用配置 - IM 服务管理 页面开通 可自助配置(配置名:多设备消息同步)收费配置(开发环境下免费) image1575645 48.4 K…

安达发|生产计划排产软件推动制造业的高质量发展

在全球经济一体化的大背景下,制造业正面临着前所未有的挑战与机遇。随着智能化技术的不断进步,生产计划排产软件作为推动制造业高质量发展的重要工具,已经成为行业转型升级的关键。 制造业作为国民经济的重要支柱,其发展水平直接关…

2024年全国VUE考试中心大全!

大家好,华为HCIA、HCIP、HCIE的笔试部分,都需要在VUE考试中心进行预约。但是很多同学都不知道当地VUE考试中心在哪里! 为了解决大家的问题,这边整理了全国各大城市的VUE考试中心名称和详细地址。需要的小伙伴们可以来看看&#x…

项目实训-vue(十一)

项目实训-vue&#xff08;十一&#xff09; 文章目录 项目实训-vue&#xff08;十一&#xff09;1.概述2.页顶导航栏3.导航信息4.总结 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.页顶导航栏 <divstyle"display: flex;justify-content: space-between;alig…

2732. 找到矩阵中的好子集

题目 给你一个下标从 0 开始大小为 m x n 的二进制矩阵 grid。 从原矩阵中选出若干行构成一个行的非空子集&#xff0c;如果子集中任何一列的和至多为子集大小的一半&#xff0c;那么我们称这个子集是好子集。 更正式的&#xff0c;如果选出来的行子集大小&#xff08;即行的…

考研数学|线代零基础,听谁的课比较合适?

线性代数是数学的一个重要分支&#xff0c;对于考研的学生来说&#xff0c;掌握好这门课程是非常关键的。由于你之前没有听过线性代数课&#xff0c;选择一个合适的课程和老师就显得尤为重要。 以下是一些建议&#xff0c;希望能帮助你找到合适的课程资源。 首先&#xff0c;…

迁移方案详解|使用YMP从异构数据库迁移到YashanDB

数据迁移简介 01典型场景与需求 在国产化浪潮下&#xff0c;数据库系统的国产化替代成为了一个日益重要的议题&#xff0c;有助于企业降低对外依赖&#xff0c;提升信息安全和自主性。 以Oracle、MySQL为代表的传统关系型数据库管理系统&#xff0c;在企业应用中占据了重要的…

食品供应链管理商城系统的设计、实现和代码

上线食品供应链管理商城系统的设计与实现是一项复杂且重要的任务&#xff0c;它不仅涉及到技术层面的具体实现&#xff0c;还包括业务流程的优化和用户体验的提升。本文将从系统设计、功能模块、技术选型以及实现步骤等方面进行详细探讨。 ### 系统设计 在设计食品供应链管理…

cad转换pdf怎么转换?介绍四个转换方法

cad转换pdf怎么转换&#xff1f;在数字化办公日益盛行的今天&#xff0c;CAD图纸的转换与处理成为许多专业人士不可或缺的技能。特别是在需要将CAD图纸转换为PDF格式时&#xff0c;一款功能强大的软件能够大大提高工作效率。今天&#xff0c;就为大家推荐四款CAD转PDF的神器&am…

Docker 安装Nginx部署网站 防火墙端口 数据卷挂载

拉取镜像 docker pull nginx#不写版本号 表示最新版本查看是否拉取成功 docker images#成功 nginx latest 605c77e624dd 2 years ago 141MB mysql 8.0 3218b38490ce 2 years ago 516MB mysql latest 3218b38490ce 2 years ago 5…

【乐吾乐2D可视化组态编辑器】水位随数据动态变化

External Player - 哔哩哔哩嵌入式外链播放器 示例&#xff1a;进度条&#xff0c;通常用来展示水位变化 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 示例&#xff1a;乐吾乐2D可视化 (le5le.com)

项目实训-vue(十三)

项目实训-vue&#xff08;十三&#xff09; 文章目录 项目实训-vue&#xff08;十三&#xff09;1.概述2.处理按钮 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.处理按钮 实现了图片的上传之后&#xff0c;还需要设置具体的上传按钮。 这段代码使用 Element UI 的 …

使用API有效率地管理Dynadot域名,为文件夹中的域名进行域名停放

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

探讨数字化背景下VSM(价值流程图)的挑战和机遇

在信息化、数字化飞速发展的今天&#xff0c;各行各业都面临着前所未有的挑战与机遇。作为源自丰田生产模式的VSM&#xff08;价值流程图&#xff09;&#xff0c;这一曾经引领制造业革命的工具&#xff0c;在数字化背景下又将如何乘风破浪&#xff0c;应对新的市场格局和技术变…

linux用户使用资源限制

linux用户使用资源限制 1. 概述2. 特殊权限&#xff08;SUID,SGID,SBIT&#xff09;3. 访问控制列表&#xff08;ACL&#xff09;4. 磁盘空间限制&#xff08;quota&#xff09;5. 进程资源限制5.1 ulimit5.2 cgroup 前言&#xff1a;linux是一个遵循POSIX的多用户、多任务、支…

车辆网络安全开发

随着智能汽车的快速发展&#xff0c;车载软件的数量和复杂性不断增加&#xff0c;同时也带来了网络安全风险。智能汽车软件开发是实现车辆智能化、信息化的重要手段。在智能汽车软件的开发过程中&#xff0c;开发人员需要遵循一定的规范和标准&#xff0c;以确保软件的质量和安…

2024最新免费版轻量级Navicat Premium Lite 下载和安装教程

2024最新免费版轻量级Navicat Premium Lite 下载和安装教程 关于猫头虎 大家好&#xff0c;我是猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…