uni webSocket连接记录

socketTask.js

let timer = null; //心跳计时器

let debug = false; //debug输出log

let retimer = null; //重连计时器

let pingCount = 0; //心跳次数

let pingCountMax = 5; //最大心跳次数超过重连

let pingTimeout = 5000; //心跳间隔时间(毫秒)

let connectTimeout = 2000; //重连时间(毫秒)

let socketTask = null; //ws

// 连接WebSocket

export function connectSocket() {

debug && console.log(socketTask);

var token = uni.getStorageSync('Authorization');

if (!token || socketTask) {

console.log('开启socketTask失败')

return

}

socketTask = uni.connectSocket({

url: 'wss://im-api.q3z3.com/ws?Authorization=' + uni.getStorageSync('Authorization'),//WebSocket地址

// url: 'ws://192.168.0.200:8080/ws?Authorization=' + uni.getStorageSync('Authorization'),//WebSocket地址

complete: () => {}

});

socketTask.onOpen(res => {

console.log('WebSocket连接已打开!');

debug && console.log(socketTask);

// 发送心跳

socketTask.send({

data: 'isConnact',

success: res => {

if (res.errMsg == 'sendSocketMessage:ok') {

debug && console.log('WebSocket心跳ping');

}

}

})

// 定时心跳

timer = setInterval(() => {

// ping超过5次未响应则重连

pingCount++

debug && console.log('ping次数'+pingCount+'/'+pingCountMax);

if (pingCount >= pingCountMax) {

clearSocketTask()

reConnectSocket()

return

}

socketTask.send({

data: 'isConnact',

success: res => {

if (res.errMsg == 'sendSocketMessage:ok') {

debug && console.log('WebSocket心跳ping');

}

}

})

}, pingTimeout)

})

// 监听接收

socketTask.onMessage(res => {

if (socketTask && token) {

if(res.data=='ok'){

pingCount = 0;

return

}

var data = JSON.parse(res.data);

console.log('WebSocket接收消息!');

}

})

// 监听关闭

socketTask.onClose((res) => {

debug && console.log(socketTask);

console.log('WebSocket连接已关闭!');

if (!socketTask) {

console.log('无需操作')

return

}

if (socketTask.readyState !== 1) {

console.log('需要重新连接')

clearSocketTask()

reConnectSocket()

}

})

// 监听异常

socketTask.onError(res => {

debug && console.log(socketTask);

console.log('WebSocket连接异常!');

if (!socketTask) {

console.log('无需操作')

return

}

if (socketTask.readyState !== 1) {

console.log('需要重新连接')

clearSocketTask()

reConnectSocket()

}

});

}

// 清理WebSocket

export function clearSocketTask() {

clearInterval(timer)

clearTimeout(retimer)

pingCount = 0;

if (socketTask) {

socketTask.close()

socketTask = null

console.log('主动关闭WebSocket!');

}

}

// 重新连接WebSocket

export function reConnectSocket() {

retimer = setTimeout(() => {

connectSocket()

}, connectTimeout)

}

main.js 全局引入

import * as socketTask from "@/common/socketTask.js";

Vue.prototype.$socketTask = socketTask;

使用 onLaunch

this.$socketTask.connectSocket()

401登录过期时候

import {clearSocketTask} from "@/common/socketTask.js";

使用

clearSocketTask()

相关推荐
猫头虎12 分钟前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
Zaralike1 小时前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络
云姜.1 小时前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议
!chen2 小时前
LabVIEW TCP Server端工具TCP通信
网络·tcp/ip·labview
枷锁—sha2 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
郝学胜-神的一滴2 小时前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
池央2 小时前
CANN 算子诊断与故障定位:oam-tools 在异构计算错误解析中的作用
网络
“αβ”2 小时前
数据链路层协议 -- 以太网协议与ARP协议
服务器·网络·网络协议·以太网·数据链路层·arp·mac地址
释怀不想释怀2 小时前
Linux网络基础(ip,域名)
linux·网络·tcp/ip