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

ops/2024/11/13 11:55:28/

websocket 封装

在所需文件夹下建立websocketUtils.js文件,封装代码如下:

class websocketUtils {constructor(openId, time) {this.url = `wss://****` //ws地址 拼接一下 此处用的是openIdthis.data = nullthis.isOpenSocket = false //避免重复连接this.timeout = time //隔多久执行检测 单位秒(s)this.heartbeatInterval = null //检测服务器端是否还存活this.reconnectTimeOut = null //重连之后隔多久才再次重连try {return this.connectSocketInit()} catch (e) {console.log('===========连接错误捕获catch====================',e);this.isOpenSocket = falsethis.reconnect();}}// 创建websocket连接connectSocketInit() {this.socketTask = uni.connectSocket({url: this.url,header: {//头部可以添加所需字段如token'content-type': 'application/json'},success:()=>{console.log("============正准备建立websocket中================");// 返回实例return this.socketTask},});this.socketTask.onOpen((res) => {console.log("==============WebSocket连接正常=============");clearTimeout(this.reconnectTimeOut)clearInterval(this.heartbeatInterval)this.isOpenSocket = true;this.start();// 只有连接正常打开中 ,才能正常收到消息this.socketTask.onMessage((res) => {console.log(res.data,'===============接收===onMessage===============')//全局注册uniapp事件,在任何页面都能接受到uni.$emit('socketMessage', res)});})// 监听失败,再次打开 判断主动重连// uni.onSocketError((res) => {// 	console.log('==========WebSocket连接打开失败哦===============');//	this.isOpenSocket = false;//	this.reconnect();// });//  socket关闭了会执行 此处this.socketTask.onClose((e) => {console.log("========已经被关闭了====================",e)this.isOpenSocket = false;// 加了flag判断是否为手动(用户主动关闭)e && e.reason == 'user' ? '' : this.reconnect();})}//发送消息send(value){//  连接正常打开时 ,才能正常成功发送消息this.socketTask.send({data: value,async success() {console.log("===========消息发送成功===============");},});}//开启心跳检测start(){this.data={value:"发送心跳内容",method:"发送心跳方法名称"}this.heartbeatInterval = setInterval(()=>{console.log('======start====开启心跳检测====',this.data)this.send(JSON.stringify(this.data));},this.timeout * 1000)}//重新连接reconnect(){//停止发送心跳clearInterval(this.heartbeatInterval)//如果不是人为关闭的话,进行重连if(!this.isOpenSocket ){this.reconnectTimeOut = setTimeout(()=>{this.connectSocketInit();},3000)}}// 关闭 WebSocket 连接closeSocket(reason = '关闭') {const _this = thisthis.socketTask.close({reason,success() {_this.data = null_this.isOpenSocket = false_this.socketTask = nullclearTimeout(_this.reconnectTimeOut)clearInterval(_this.heartbeatInterval)console.log('===============关闭 WebSocket 成功===================')},fail() {console.log('===================关闭 WebSocket 失败=====================')}})}//将获取的消息导出外部exportMessage(callback) {this.socketTask.onMessage((res) => {console.log(res,'===============exportMessage============')return callback(res)})}
}module.exports = websocketUtils 

页面引入使用 

全局引入:

1.在main.js中引入,并全局注册

//引入websocket文件
import websocketUtils from '@/utils/websocketUtils.js'//挂载并开启websocket
Vue.prototype.$socketUtils = new websocketUtils("*******",10)

 2.指定页面中使用

// 发送消息
let data={value:"发送的value"}
this.$socketUtils.send(JSON.stringify(data));// 接收消息
this.$socketUtils.exportMessage(res=>{console.log(res);
})
 单页面使用引入:
<!--  页面  -->
<template><view class='e-about-operation-wrap'></view>
</template><script>import websocketUtils  from '@/utils/websocketUtils.js'const app = getApp()export default {name: 'ESign',components: {},data() {return { };},onLoad: function(option) {},onShow: function() {//在uniapp全局中定义了socketWBObj变量app.globalData.socketWBObj = new websocketUtils(this.user.loginInfo.openId,10)//监听获取消息uni.$on('socketMessage', this.wbSocketGetMsg)//方法获取收到的消息app.globalData.socketWBObj.exportMessage(res => {console.warn(res);})},onHide: function() {},onUnload(e) {},created() {},mounted() {},methods: {wbSocketGetMsg(res){const _this = thisconsole.log(res,'======wbSocketGetMsg==========')// 关闭连接if (app.globalData.socketWBObj) {app.globalData.socketWBObj.closeSocket('user')}}},watch: {},computed: {},}
</script>
<style lang='scss' scoped>
.e-about-operation-wrap{}
</style>


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

相关文章

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…

Linux 学习之路 -- 进程篇 -- 进程控制

目录 一、进程终止 <1>使用语言和系统自带的方法&#xff0c;进行转换 <2>自定义错误码 <3>小结&#xff1a; <2>两个接口exit / _exit 二、进程等待 <1>简单了解 <2>wait调用 <3>waitpid调用 <4>status <1>W…

error ‘xxx‘ is defined but never used(2024/4/21更新)

vue中我们经常会遇到这种报错&#xff0c;可能有的变量是传来但不一定现在用得上的却会导致报错 解决方法&#xff1a; 在package.json文件的rules中加上以下内容 "no-unused-vars": "off"&#x1f388;如果没有即时生效重新启动项目即可

【web开发网页制作】html+css家乡长沙旅游网页制作(4页面附源码)

家乡长沙网页制作 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、历史长沙Page3、著名人物Page4、留言区 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码HtmlCSS 五、源码获取5.1 获取方式 作者寄语 涉及知识 家乡长沙网页制作&#x…

MySQL中InnoDB存储引擎详细介绍

介绍 InnoDB是一种兼顾高可靠性高和高性能的通用存储引擎&#xff0c;在MySQL5.5之后&#xff0c;InnoDB是默认的MySQL存储引擎。 特点 DML(增删改)操作遵循ACID(事务四大特性)模型&#xff0c;支持事务&#xff1b;行级锁&#xff0c;提高并发访问性能支持外链FORELGN KEY约…

【运维】docker-compose部署redis

部署Redis使用docker-compose是一种简便且流行的方式。以下是基本的docker-compose.yml文件示例&#xff0c;用于部署单节点Redis服务 方案一 直接使用docker安装单机版 创建.env环境文件并配置管理密码 echo REDIS_PWDredis123456 > .env创建docker-compose.yml环境文件…

Anon Network:基于 Ator Protocol 的 DePIN 匿名互联网

Anon Network正在以Ator Protocol为基础构建世界上最大的Web3隐私互联网生态&#xff0c;其旨在基于DePIN网络&#xff08;Ator protocol&#xff09;&#xff0c;通过激励体系构建一个自下而上、自我维持且可持续、不依赖于任何三方实体且完全匿名的完备互联体系。在该体系中&…