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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言中的HTTP头信息处理

在Web开发中,HTTP头信息扮演着至关重要的角色。它们提供了关于HTTP请求和响应的元数据,如内容类型、缓存控制、认证信息等。Go语言,作为一种高效且强大的编程语言,提供了丰富的标准库来处理HTTP头信息。 首先,我们需要…

react useEffect 内存泄漏

componentWillUnmount() {this.setState (state, callback) > {return;};// 清除reactionthis.reaction();}useEffect 使用AbortController useEffect(() > { let abortController new AbortController(); // your async action is here return () > { abortCo…

Linux内存管理:(五)反向映射RMAP

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识:page数据结…

目标检测-One Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是: 和Fast-CNN相比,速度快,但精度下降。(边框回归不加限制)…

企业传输大文件时在企业网盘和文件传输平台之间该怎么选?

在当今数字化时代,企业常常需要传输大量文件,包括设计图纸、视频、音乐、数据集等。这些文件可能很大,往往需要高效、安全地传输。对于企业来说,选择合适的工具至关重要。在企业网盘和文件传输平台之间,如何做出正确的…

民安智库:满意度调查在组织管理中的应用与价值

在当今竞争激烈的市场环境中,组织管理的成功与否往往取决于其能否满足客户的需求和期望。满意度调查作为一种有效的管理工具,可以帮助组织了解客户对其产品或服务的评价和意见,从而指导组织改进产品或服务,提升客户满意度和忠诚度…

微信怎么做小程序店铺?如何制作微信小程序店铺

在这个数字化的时代,拥有一个属于自己的线上店铺已经成为了一种趋势。而微信小程序,作为微信平台上的一种轻应用,无疑成为了许多人开店的首选。那么,如何利用微信小程序开设自己的店铺呢?下面就让我来为大家详细解析一…

(03)光刻——半导体电路的绘制

01、绘制精细电路的第一步 金属-氧化物半导体场效应晶体管(MOSFET)的革命,让我们可以在相同面积的晶圆上同时制造出更多晶体管。MOSFET体积越小,单个 MOSFET的耗电量就越少,还可以制造出更多的晶体管,让其发挥作用,可谓是一举多得。可见,制造更小的MOSFET成了关键因素…

专属定制适合个人的知识付费平台,打造个性化品牌与自主管理体验

明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费平台已经成为人们获取专业知识、提升自身素质的重要渠道。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。因此,我们提出了专属定…

锂电池寿命预测 | Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测。 参考资料 [1] http://t.csdn…

Golang - defer关键字 深入剖析

defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式: f,err : os.Open(filename) if err ! nil {panic(err) } defer f.Close()如果有多个defer表达式,调用顺序类似于栈&a…

贪心算法day01

目录 理论基础 455.分发饼干 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 376. 摆动序列 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 53. 最大子序和 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程…

CentOS 7 安装 PPTP

环境: 阿里云试用机: 外网IP:114.55.80.150 内网IP:172.28.11.92 一、服务器安装 PPTP 1、安装 yum install epel-release -y 2、安装pptp yum install pptpd iptables-services -y 3、修改配置 vim /etc/pptpd.conf# 最…

CAAC无人机操作证考证报名流程及白底证件照片制作方法

在这个无人机技术日新月异的时代,拥有一张CAAC民用无人机操作证不仅意味着你能够合法地在天空翱翔,也象征着你对飞行技术的尊重和对规章制度的遵守。如果你怀揣着成为无人机飞行员的梦想,那么,让我们一起揭开CAAC民用无人机操作证…

Flutter中的Container小部件介绍与使用

Flutter中的Container是一个强大而灵活的小部件,用于布局和装饰。它可以包含子部件,并具有多种属性,使得它成为构建用户界面的常见选择之一。 什么是Container? Container是一个用于包装和定位子部件的小部件。它允许您指定宽度…

YOLOv8训练DOTAv2数据集(官网代码/数据集转换/2024.1.2)

目的 由于项目里面需要用到机载的旋转目标检测(Oriented Bounding Box, OBB),本来想在yolov8上面直接加obb检测相关的模块,没想到官方更新了DOTAv2数据的yaml文件,意味着v8已经支持了obb检测,但是现在版本还不是很完善…

【SpringCloud】6、Spring Cloud Gateway路由配置

在 Spring Cloud Gateway 中配置 uri 有三种方式,包括: 1、WebSocket路由 spring:cloud:gateway:routes:- id: bt-apiuri: ws://localhost:9090/predicates:

静态网页设计——美食杰官网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:仿照美食杰官网 主要内容 1、首页 首页用html标签分割成多个区域,使用css设置样式,精准…

《软件项目接口安全设计规范》

1.token授权机制 2.https传输加密 3.接口调用防滥用 4.日志审计里监控 5.开发测试环境隔离,脱敏处理 6.数据库运维监控审计 软件全套文档:软件开发全套资料-CSDN博客

RA8803SA 车载用实时时钟模块

内置32.768kHz 晶体单元(频率精度调整完毕)和DTCXO1/100s精度的时间寄存器接口类型:I2C-Bus接口(400kHz)工作电压范围:1.6V to 5.5V温度补偿电压:2.2V to 5.5V计时(保持)电压范围:1.6V to 5.5V可选择输出频率为32.768kHz, 1024Hz,…