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

相关推荐
GTgiantech4 小时前
科普SFP 封装光模块教程
服务器·网络·数据库
0和1的舞者5 小时前
网络通信的奥秘:HTTP详解 (七)
服务器·网络·网络协议·http·okhttp·软件工程·1024程序员节
Ashlee_code5 小时前
BSS供应商:电信与金融领域的幕后支撑者
大数据·网络·金融·系统架构·跨境·金融机构·场外期权
节点小宝5 小时前
节点小宝免费版流量机制解析:点对点直连技术与备用流量设计
网络·网络协议·p2p
创业之路&下一个五年7 小时前
按照ip的转换为二进制的方式理解a\b\c类地址的边界
服务器·网络·tcp/ip
陌路207 小时前
Linux29初识网络:核心概念与分层逻辑
网络
huangdengji7 小时前
基于openresty反向代理、dns劫持、实现对http请求、响应内容抓包
网络协议·http·openresty
Acrelhuang8 小时前
覆盖全场景需求:Acrel-1000 变电站综合自动化系统的技术亮点与应用
大数据·网络·人工智能·笔记·物联网
阿猿收手吧!8 小时前
【Linux网络】shutdown()与close()的区别
linux·网络
記億揺晃着的那天9 小时前
解密 HTTPS:从握手到安全通信
网络协议·安全·https·ssl证书