vue封装websocket以及心跳检测、重连

ops/2024/9/25 11:19:10/

关于websocket的封装有很多,此处记录一下自身项目已封装好的且已应用的,备份。

webSocketUtil.js:

class WebSocketUtils {constructor() {this.url = null //ws地址 或者 wssthis.data = nullthis.isOpenSocket = false //避免重复连接this.timeout = 20 //隔多久执行检测 单位秒(s)this.heartbeatInterval = null //检测服务器端是否还存活this.reconnectTimeOut = null //重连之后隔多久才再次重连}// 创建websocket连接connectSocketInit(url) {if (!this.socketTask || this.socketTask.readyState === WebSocket.CLOSED) {this.url = urlthis.socketTask = new WebSocket(url)this.socketTask.onopen = (event) => {console.log("==============WebSocket打开连接=============", event)clearTimeout(this.reconnectTimeOut)clearInterval(this.heartbeatInterval)this.isOpenSocket = truethis.socketTask.send(`ping`)this.startPingPong()}// 连接正常 接收消息中this.socketTask.onmessage = (event) => {console.log(event, '===========onmessage==============')try {if (event.data && event.data != 'null') {const jsonData = JSON.parse(event.data)console.log(jsonData, '===========onmessage=====jsonData=========')}} catch (err) {console.error('onmessage-err', err)}}//  socket关闭了会执行 此处this.socketTask.onclose = (event) => {console.log("========onclose============", event)this.isOpenSocket = falsethis.socketTask = nullthis.stopPingPong()if (event.code !== 4000) {setTimeout(() => {console.log('=========关闭重连reconnect===========')this.reconnect()}, 3000)}}this.socketTask.onerror = (error) => {console.log('============onerror============', error)}} else {console.log('Soeket exists, no need to create it, 链接状态:', this.socketTask.readyState === WebSocket.OPEN)}}//发送消息send(message) {//  连接正常打开时 ,才能正常成功发送消息if (this.socketTask && this.socketTask.readyState === WebSocket.OPEN) {this.socketTask.send(message)}}//重新连接reconnect() {const _this = thisif (!_this.url) {return}//停止发送心跳clearInterval(_this.heartbeatInterval)//如果不是人为关闭的话,进行重连if (!_this.isOpenSocket) {_this.reconnectTimeOut = setTimeout(() => {_this.connectSocketInit(_this.url)}, 3000)}}// 关闭 WebSocket 连接closeSocket(code = 4000, reason = '关闭') {const _this = this_this.socketTask.close(code,reason)_this.data = null_this.url = null_this.isOpenSocket = false// _this.socketTask = nullclearTimeout(_this.reconnectTimeOut)clearInterval(_this.heartbeatInterval)console.log('===============关闭 WebSocket 成功===================')}//开启心跳检测startPingPong() {const _this = thisif (_this.heartbeatInterval) {clearInterval(_this.heartbeatInterval);}_this.data = { value: "ping", name: "心跳检测" }_this.heartbeatInterval = setInterval(() => {// console.log('==========开启心跳检测====', _this.data)_this.send(JSON.stringify(_this.data))}, _this.timeout * 1000)}stopPingPong() {// 停止Ping-Pong定时器if (this.heartbeatInterval) {clearInterval(this.heartbeatInterval);this.heartbeatInterval = null;}}//将获的取消息导出外部exportMessage(callback) {this.socketTask.onmessage = (res) => {console.log(res, '===============exportMessage============')try {return callback(res.data)} catch (err) {console.error('exportMessage-err', err)return callback(err)}}}
}const websocketUtils = new WebSocketUtils()export default websocketUtils

引用:

再main.js中引入并挂载

import webSocketUtil from '@/utils/webSocketUtil';app.config.globalProperties.$webSocketUtil = webSocketUtil;

在所需页面打开连接,并监听数据返回

//监听消息
const handleWsMsg= (res) => {console.log('========handleWsMsg=========',res);
}proxy.$webSocketUtil.connectSocketInit('wss://xxxxxxxxx')
proxy.$webSocketUtil.exportMessage(handleWsMsg)//关闭连接
if(proxy.$webSocketUtil.socketTask){proxy.$webSocketUtil.closeSocket()
}


http://www.ppmy.cn/ops/15500.html

相关文章

QAnything纯Python环境安装流程

QAnything纯Python环境安装流程 在本指南中,我们将详细介绍如何在不同操作系统上安装QAnything工具的纯Python环境。QAnything是一个功能强大的工具,它提供了多种模型和API的支持,使得自然语言处理任务变得更加简单。本文将逐步介绍安装过程…

如何删除.git

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

企业数字化转型,“业务”先行

在当今时代,数字化转型已经成为企业发展的必经之路。数字化转型,简而言之,就是运用数字技术,对企业运营管理的各个环节进行深度改造,以提升企业的运营效率和市场竞争力。据有关机构研究测算,数字化转型可使…

Https协议原理剖析【计算机网络】【三种加密方法 | CA证书 】

目录 一,fidler工具 前提知识 二,Https原理解析 1. 中间人攻击 2. 常见的加密方式 1). 对称加密 2). 非对称加密 对称加密 4). CA证书 1. 数据摘要 3. 数字签名 CA证书 理解数据签名 存在的安全疑问&am…

Emby for Mac 1.9.9中文激活永久使用(多媒体影音库)

Emby 是一款流媒体服务器软件,可以用于在不同设备上共享音乐、电影、电视节目和照片等多媒体资源。用户可以将自己的媒体文件添加到Emby服务器中,并通过网络将它们发送到其他设备,如电视、手机、平板电脑等。 Emby for Mac 1.9.9中文激活下载…

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN(Yet Another Resource Negotiator)是Apache Hadoop生态系统中的一个子项目,它是用于集群资源管理的框架,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台&…

C++奇迹之旅:深入思考拷贝构造函数

文章目录 📝拷贝构造函数🌠 概念🌉特征 🌠浅拷贝(值拷贝)🌉深拷贝 🌠拷贝构造函数典型调用场景🌠应用时效率的思考🚩总结 📝拷贝构造函数 🌠 概念 在现实生…

doccano 实体识别标注的数据转为 大模型微调的数据集格式

文章目录 背景简介数据集样例转换代码代码公开进一步阅读 背景 用实体识别的标注数据集微调大模型,往往大模型的效果会好一点。 故笔者提供了将 Doccano 实体标注格式的数据集转为大模型微调数据集的代码; 简介 展示 Doccano 实体识别导出的数据集格…