socket实例 挂载到全局

为方便梳理,请忽略typescript

# main.ts
import {createApp} from 'vue' import App from './App.vue'
import {socket} from "@/xihu/socket"
import router from "@/xihu/router" const app = createApp(App);
app.use(router).mount('#root'); // 全局挂载
app.config.globalProperties.$socket = socket;

Socket封装(断线重连)

这个WebSocket类封装了WebSocket的连接、重连、发送数据等方法。

connect方法中,它会连接WebSocket,并绑定相关事件监听。

onclose事件中,它会调用reconnect方法进行重连。

reconnect方法会在一定时间内重连,并且重连的时间间隔会越来越长,最大重连次数达到设定值后就不再重连。

这样就实现了一个可以断线重连的WebSocket连接。

我们可以在vue应用中使用这个类来进行WebSocket通信,并处理可能出现的网络断开重连情况。

# socket.ts

// @ts-nocheck
export default class Socket {
constructor(url, protocols) {
this.url = url
this.protocols = protocols
this.ws = null
this.reconnectTimeout = 1000
this.maxReconnectTimes = 5
} connect() {
this.ws = new WebSocket(this.url, this.protocols)
this.ws.onopen = () => {
console.log('WebSocket连接成功')
this.reconnectTimes = 0
}
this.ws.onclose = () => {
console.log('WebSocket断开连接')
this.reconnect()
}
this.ws.onerror = err => {
console.log('WebSocket连接出错', err)
}
} reconnect() {
if (this.reconnectTimes < this.maxReconnectTimes) {
setTimeout(() => {
this.connect()
this.reconnectTimes++
}, this.reconnectTimeout)
this.reconnectTimeout *= 2
} else {
console.log('WebSocket重连超过最大次数,放弃重连')
}
} // 消息发送
msg(param) {
if (param === 'heartbeat') {
this.ws.send(param);
} else {
this.ws.send(JSON.stringify(param));
}
} // 延迟发送
timeout(param) {
setTimeout(() => {
this.msg(param);
}, 2000)
} send(param) {
if (this.ws.readyState === this.ws.OPEN) {
this.msg(param);
} else if (this.ws.readyState === this.ws.CONNECTING) {
this.timeout(param);
} else {
this.timeout(param);
}
}
}

实例化socket

通过type关键字,分发数据,并且通过pinia(vuex)存储实时数据

在消息回调函数,处理返回的数据,使用type关键字对应各种推送事件,比如:实时设备告警、地图显示用户坐标等等...

// @ts-nocheck
import {createPinia} from 'pinia';
import {useAlarm} from '@/store/alarm'; // 状态管理
export const pinia = createPinia();
export const store = useAlarm(pinia); export function wsInit(callback) {
const url = 'ws://api.xx.cn';
const init = new Socket(url); // 连接 WebSocket
init.connect(); // 监听 WebSocket
init.ws.onmessage = function (ev) {
if (ev && ev.data && ev.data.indexOf('subscribe') > -1) {
console.log('subscribe->', ev.data);
} else if (ev && ev.data) {
var data = eval('(' + ev.data + ')');
callback(data);
}
}; return init;
} // 消息回调
export const socket = wsInit((data) => {
switch (data.type) {
case 1:
store.setType1(data);
break;
case 2:
store.setType2(data.message);
break;
}
});

状态管理

import {defineStore} from 'pinia'
export const useAlarm = defineStore('user', {
state:()=>({
type1:{},
type2:{},
}),
getters:{
getType1: (state) => state.type1,
getType2: (state) => state.type2,
},
actions:{
setType1(payload: any) {
this.type1 = payload;
},
setType2(payload: any) {
this.type2 = payload;
},
},
})

在页面中,使用数据(pinia)

import { watch, computed, onMounted, getCurrentInstance} from 'vue'
import {useAlarm} from "@/xihu/store/alarm";
const store = useAlarm(); // 还记得全局挂载的`$socket`吧,这样使用
const ctx: any = getCurrentInstance();
const {$socket} = ctx.appContext.config.globalProperties; onMounted(() => {
// 列表数据 -- 通过给`websocket`发送`{"cmd":"1"}`实现数据交互
$socket.send({cmd: 1});
}); const click = ()=>{
// 其他数据 -- 点击列表的某一项,根据参数获取数据
$socket.send({cmd: 2,extras:{id:123}});
} // 第一种 监听方式:
const type1 = computed(() => store.type1);
watch(type1, (message: any) => {
console.log('/computed/watch/', message);
}, {deep: true}); // 第二种 监听方式:
store.$subscribe(({events}: any, state) => {
if (events.key === 'type1') {
console.log('/$subscribe/', state.type1);
}
});

大多数情况,数据是后台主动推送的,比如:告警数据,这也是使用websocket的主要原因

ai问答:vue3+pinia+WebSocket 封装断线重连(实战)的更多相关文章

  1. webSocket使用心跳包实现断线重连

    首先new一个webscoket的连接 let noticeSocketLink = new WebSocket(‘webSocket的地址’) 这里是连接成功之后的操作 linkNoticeWebs ...

  2. js websocket断线重连

    js websocket断开重连实例代码,请根据自己需求做出相应改动Vue中使用websocket $(function() { var lockReconnect = false;//避免重复连接 ...

  3. uniapp小程序webSocket封装使用

    目录 1,前言 2,代码实现 3,使用 3.1,初始化 3.2,发送消息 3.3,接收消息 1,前言 最近在做IOT的项目,里面有个小程序要用到webSocket,借这个机会,封装了一个uniapp小 ...

  4. 理解WebSocket心跳及重连机制(五)

    理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...

  5. 【简记】前端对接WebSocket与心跳重连

    前言 最近又在忙着开发别的模块,其中包含了即时通讯这一块,上一次做即时通讯时还是去年年底,一时间代码都在自己的笔记本里,还没带--这里就记录一下前端对接WebSocket的实现,包含心跳重连,简记之. ...

  6. EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73441405 介绍 EasyRTMP是Eas ...

  7. 微信小程序使用原生WebSokcet实现断线重连及数据拼接

    以前做小程序为了应急找了个插件去链接WebSokcet,文章传送门. 回过头在新项目中再次使用时出现了些许问题,不一一赘述.遂决定好好用一下原生的WebSokcet. 一.说明 1.小程序原生的Web ...

  8. java-websocket客户端 断线重连 注入Service问题

    java版客户端: 使用开源项目java-websocket, github地址: https://github.com/TooTallNate/Java-WebSocket github上有很多示例 ...

  9. 关于socket tcp 断线重连

    这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...

  10. netty4 断线重连

    转载:http://www.tuicool.com/articles/B7RzMbY 一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端 ...

随机推荐

  1. ArrayList学习

    核心源码 package java.util; import java.util.function.Consumer; import java.util.function.Predicate; imp ...

  2. F - Substring of Sorted String

    题目链接 题解(树状数组) 我们维护两个树状数组,一个记录 \(1\sim i\) 中 \(s_i>s_{i+1}\)的数量,即逆序对数量,另一个记录 \(1\sim i\) 中 \(26\) ...

  3. adb shell monkey

    monkey 在模拟器或真机里在,.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),打开app 查看包名 adb shell dumpsys window windows | f ...

  4. 痞子衡嵌入式:我当选了2019年度官方论坛i.MXRT板块的顶级贡献者

    痞子衡桌上有一个联邦快递公司件,放了近一个月了,是同事代领的,痞子衡一直没有拆开.今天心血来潮,决定拆开瞧一瞧,这一拆就拆出了一天的好心情. 原来快递里面是一件i.MXRT产品纪念T-shirt,还有 ...

  5. Python学习笔记--图像的进一步学习

    演示地图的可视化的实现 示例: 设置全局选项 可以设置出不同的颜色,不会显得很干巴: 国内地图: 那么,我们应当如何找到相对应的颜色的编号呢? 基本步骤: 前往ab173.com网站 然后在,前端那里 ...

  6. Linux & 标准C语言学习 <DAY5>

    一.if分支语句     if(表达式)  //单分支语句     {           //表达式的值为真,则执行此处代码     }     if(表达式)  //双分支语句     {     ...

  7. Mybatis模糊查询的两种方式

    第一种 使用 || 字符: ** ** 第二种 使用 CONCAT 函数: ** ** 温馨提醒: 当然你也可以使用 $符 ,但是这种方式会导致不安全,让非法分子有机可寻,轻则数据库瘫痪,重则数据泄露 ...

  8. ArcGIS模型构建器ModelBuilder的使用方法

      本文介绍在ArcMap软件中,基于模型构建器(ModelBuilder)完成模型建立与使用的具体方法.   首先,在ArcMap软件中打开"ModelBuilder".   建 ...

  9. 机器学习算法(八):基于BP神经网络的乳腺癌的分类预测

    机器学习算法(八):基于BP神经网络的乳腺癌的分类预测 1.算法简介和应用 1.1 算法简介 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学 ...

  10. nodejs,,一些基本操作--server。js

    1.解决中文乱码问题: const http = require('http') const server = http.createServer((req, res) => { // 设置字符 ...