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

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值