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()

相关推荐
小快说网安4 分钟前
高防 IP 的 “防护上限”:带宽、清洗能力、防御类型如何匹配业务需求
网络·tcp/ip·安全
Meaauf27 分钟前
VMware五种网络模式详解与EVE-NG互联指南
运维·服务器·网络
桦031 分钟前
[Linux复习]:网络
linux·运维·网络
不会写DN36 分钟前
如何设计应用层 ACK 来补充 TCP 的不足?
开发语言·网络·数据库·网络协议·tcp/ip·golang
snow@li1 小时前
协议:应用层开发都会涉及哪些协议 / 详细整理 / http、ws、https、wss
网络协议·http·https
IT摆渡者1 小时前
JUMPSERVER堡垒机部署
linux·运维·网络·经验分享·笔记
FS_Marking1 小时前
短距离网络10G SFP+光模块选型指南
网络·人工智能
爱学习的小囧1 小时前
vSphere 9.0 API 实操教程 —— 轻松检索 vGPU 与 DirectPath 配置文件
linux·运维·服务器·网络·数据库·esxi·vmware
fei_sun1 小时前
数字积木(IP)设计流程
服务器·网络·tcp/ip
椰猫子1 小时前
Javaweb(Http、Maven)
网络·网络协议·http