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

文章目录

    • 一、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外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】卷积

卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发射器每个时刻 t t t产生一个信号 x t x_t xt​,其信息的衰减率为 w k w_k wk​,即在 k − 1 k-1 k−1个时间步长后,信息为原来的 w k w_k wk​倍,时刻 …

电脑图片压缩方法哪个好?这几个压缩方法必看

大家是否经常因为图片文件过大而无法轻松分享或上传而感到困扰?这说明你需要一款高效的图片压缩工具了。 无论是为了节省存储空间还是快速分享图片,拥有一款功能强大的图片压缩软件将极大地助你保存和分享图片。 今天,本文将介绍几款图片压…

QT自定义信号和槽函数

在QT中最重要也是必须要掌握的机制,就是信号与槽机制,在MFC上也就是类型的机制就是消息与响应函数机制 在QT中我们不仅要学会如何使用信号与槽机制,还要会自定义信号与槽函数,要自定义的原因是系统提供的信号,在一些情…

基于Python的求职招聘管理系统【附源码】

摘 要 随着互联网技术的不断发展,人类的生活已经逐渐离不开网络了,在未来的社会中,人类的生活与工作都离不开数字化、网络化、电子化与虚拟化的数字技术。从互联网的发展历史、当前的应用现状和发展趋势来看,我们完全可以肯定&…

前后端交互的弯弯绕绕

前后端交互: 🆗,收拾一下心情让我们来聊一聊AJax吧,随着前端的飞速发展,前后的交互也发生了天翻地覆的变化: 前后端交互的方式有很多: AJAX、表单提交、WebSocket、RESTful API、... 这对新入…

九、(正点原子)Linux定时器

一、Linux中断简介 1、中断号 每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变量表示中断号。在Linux中,我们可以使用已经编写好的API函数来申请中断号,定义…

微服务中不同服务使用openfeign 相互调用

首先 我们上文 已经知道了 nacos 的注册服务,现在 我们 在不同服务中相互调用就可以使用openfeign 直接调用,而不是 再写冗余的调用代码啦 首先 我们的微服务组件如下 因为我这个微服务是我在 员工登录demo 中 拆出来的,在userlogin模块中…

基于4G工业路由器的连锁品牌店铺组网监测

基于4G工业路由器的连锁品牌店铺组网监测是智慧城市建设中至关重要的任务,它涉及到营运管理等多方面,应用物联网技术可确保店铺运营的高效、安全和可靠。 连锁品牌店铺遍布城市各领域,甚至跨城市部署,分布广泛。这对集团总部的管…

HTTP/2 头部压缩 Header Compress(HPACK)详解

文章目录 1. HPACK 的工作原理1.1 静态表1.2 动态表 2. 压缩过程2.1 编码过程2.2 解码过程 3. HPACK 的优势 在HTTP1.0中,我们使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这着实是一…

JavaWeb——MySQL:navicate客户端工具简单使用

目录 1. 连接 2. 新建数据库 3. 使用数据库 4. 新建表 5.使用表 6. 导出数据库 我这里是英文版,没有进行汉化。 1. 连接 点击左上角Connection,选择MySQL,(我连接的是自己计算机上的数据库)连接名输入&#x…

F5《企业DNS建设白皮书》中的DNS解析服务器最佳实践

在这个数字化转型加速的时代,DNS(域名系统)的重要性不言而喻。每一次重大事件都凸显了DNS的可靠性和安全性问题。对企业而言,它不仅关系到业务连续性,更是提供永续数字服务的关键。本文根据F5公司发布的《企业DNS建设白…

Mybatis-Plus学习|快速入门CRUD、主键生成策略(雪花算法、主键自增等)、自动填充、乐观锁、分页插件、逻辑删除

MyBatisPlus概述 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! JPA、tk-mapper、MyBatisPlus 偷懒的! MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变&#xff…

基于JSP的列车票务信息管理系统

开头语: 你好,我是专注于计算机科学与技术研究的学长。如果你对列车票务信息管理系统感兴趣或有相关需求,欢迎联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDE、数据库管理工具…

spring boot jar 启动报错 Zip64 archives are not supported

spring boot jar 启动报错 Zip64 archives are not supported 原因、解决方案问题为什么 spring boot 不支持 zip64zip、zip64 功能上的区别zip 的文件格式spring-boot-loader 是如何判断是否是 zip64 的? 参考 spring boot 版本是 2.1.8.RELEASE,引入以…

HBDNY-40/1端子排电压继电器 DC110V 导轨安装 约瑟JOSEF

HBDNY系列端子排型电压电流继电器 系列型号:(3、4过/低电压型,5、6过/低电流型) HBDNY-30/1端子排型电压继电器;HBDNY-30/2端子排型电压继电器; HBDNY-30/3端子排型电压继电器;HBDNY-30/4端子…

摩柏BI,轻松实现word报告自动更新

|| 导语 告别手工!在数字化办公的今天,高效、准确的数据处理能力已经成为职场人士必备的技能之一。尤其是对于财务分析师、市场研究员和管理人员,他们需要处理的报告不仅数量庞大,而且对数据的准确性和实时性要求极高。传统WORD报…

python爬虫需要什么HTTP代理?

用来爬虫的话,还是建议用高匿名代理,但显然题主用了高匿名代理还是出现了一部分问题,我们可以先找到问题关键再解决它,一般爬虫用了高匿名代理出现被封会有以下几种原因: 1.代理IP的质量不过关 一般来说每个网站都有…

解锁小红书新玩法:中小企业出海营销的集成策略

随着全球数字化浪潮的推进,小红书作为生活方式分享平台的崛起,为中小企业提供了一个全新的营销舞台。NetFarmer,作为专注于企业数字化出海的服务商,深谙小红书的营销策略,并致力于通过HubSpot产品销售与实施&#xff0…

HarmonyOS应用开发学习经验

一、HarmonyOS学习官网 开发者能力认证 HarmonyOS应用开发者基础认证6月之前的学习资源官网已经关闭过期,大家不要慌,官方更新了最新资源,但是,对于之前没有学习完的学员不友好,存在知识断片的现象,建议官…

微型导轨:手术机器人的高精度“骨骼”

微型导轨精度高,摩擦系数小,自重轻,结构紧凑,被广泛应用在医疗器械中,尤其是在手术机器人中的应用,通过手术机器人,外科医生可以远离手术台操纵机器人进行手术。可以说,是当之无愧的…