uniapp下实现心跳检测服务端并且结婚生命周期自动再次连接绑定客户端

news/2025/1/4 16:34:10/文章来源:https://www.cnblogs.com/wt645631686/p/18646498

page code

<template><view class="container">/////</view>
</template><script>import socket  from '@/util/socket';export default {data() {return {};},onLoad() {console.log('页面加载了,initWebSocket')this.initWebSocket();},onUnload() {console.log('监听页面卸载    ,initWebSocket')// 清理 WebSocket 客户端this.cleanupWebSocket();},onShow(){console.log('页面显示了,initWebSocket')this.initWebSocket();this.getUser();},onHide(){console.log('页面隐藏了,清理 WebSocket 客户端')this.cleanupWebSocket();},methods: {
            initWebSocket() {// 启动 WebSocket 客户端console.log(44331)socket.socket.connect();},cleanupWebSocket() {// 清理 WebSocket 客户端资源if (socket.socket) {socket.socket.cleanup();}}},}
</script><style lang="scss" scoped>
////
</style>

/util/socket.js文件内容

import { socket_url } from '@/common/config'; // 确保路径正确
class WebSocketClient {constructor(url = socket_url) {this.url = url;this.socketTask = null;this.time = null;this.reconnectAttempts = 0; // 重连尝试次数this.maxReconnectAttempts = Infinity; // 默认为无限次重连this.isConnecting = false; // 防止重复连接this.autoConnectInterval = 1200; // 自动连接间隔时间,默认5秒this.pingInterval = 2000; // 心跳检测间隔时间,默认8秒this.lastPongTime = Date.now(); // 上次收到pong的时间
    }connect() {console.log(this.isConnecting)console.log(this.socketTask)if (this.isConnecting || this.socketTask) return;this.cleanup(); // 清除旧的 socketTask 和事件监听器this.bindEvents(); // 先绑定事件监听器this.isConnecting = true;console.log('尝试连接...');this.socketTask = uni.connectSocket({url: this.url,success: () => {console.log('connectSocket 请求已发出');},fail: (err) => {console.error('connectSocket 请求失败:', err);this.handleError();}});}bindEvents() {const that = this;// 绑定 onOpen 事件uni.onSocketOpen(() => {console.log('WebSocket 已打开');that.isConnecting = false;that.reconnectAttempts = 0; // 重置重连尝试次数
            that.setConnect();that.startPingPong(); // 启用心跳检测
        });// 绑定 onMessage 事件uni.onSocketMessage((res) => {let data = res.data;console.log("WebSocket 收到消息:" + data);try {data = JSON.parse(data);} catch (e) {console.log('ws接收到非对象数据', data);return;}var type = data.type || '';switch(type){case 'get_client_id':that.bindUid(data.data.client_id);break;case "xxxxxx"://xxxxxbreak;}if (type === 'pong') {that.lastPongTime = Date.now();console.log('收到 pong 响应');}});// 绑定 onError 事件uni.onSocketError(() => {console.warn('WebSocket 错误');that.handleError();});// 绑定 onClose 事件uni.onSocketClose(() => {console.warn('WebSocket 已关闭');that.handleError();});}handleError() {this.socketTask = null;this.isConnecting = false;this.reconnectAttempts++;console.warn(`尝试重新连接 (${this.reconnectAttempts})`);setTimeout(() => {this.connect(); // 尝试重新连接}, this.autoConnectInterval); // 每5秒尝试一次重连
    }setConnect() {console.log('WebSocket 建立连接');}startPingPong() {clearInterval(this.time); // 先清除计时器this.time = setInterval(() => {const now = Date.now();if (now - this.lastPongTime > this.pingInterval * 2) {console.warn('心跳超时,尝试重新连接');this.handleError();} else {console.log('发送 ping');uni.sendSocketMessage({data: JSON.stringify({ type: 'ping' })}).catch(err => {console.error('发送心跳检测消息失败:', err);});}}, this.pingInterval);}bindUid(client_id) {console.log('WebSocket 绑定客户端id' + client_id);let organise_id = uni.getStorageSync('organise_id');let admin_id = uni.getStorageSync('admin_id');if (organise_id && admin_id) {uni.$u.api.postBindAppAdminClientId({ client_id, organise_id, admin_id }).then(res => {if (res.code == 1) {console.log('绑定成功');}});}}cleanup() {// 关闭现有的 socketTask 并设置为 nullif (this.socketTask) {this.socketTask.close();this.socketTask = null;}// 清除心跳检测定时器clearInterval(this.time);// 清除自动连接定时器if (this.autoConnectTimer) clearInterval(this.autoConnectTimer);}
}// 创建单例并导出
const socketInstance = new WebSocketClient(socket_url); // 替换为实际的 WebSocket URL

export default {socket: socketInstance
};

 

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

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

相关文章

cMT-SVR服务器使用笔记

1,特点 (1) cMT-SVR100和cMT-SVR102的区别: cMT-SVR102内建EasyAccess2.0授权; (2) cMT-SVR200和cMT-SVR202的区别: cMT-SVR202内建EasyAccess2.0授权; (3) cMT-SVR200和cMT-SVR202支持10.5VDC~28VDC宽电压输入, cMT-SVR100和cMT-SVR102不支持宽电压输入; (4) USB口作…

案件分析助手:AI知识库在法律研究中的应用

在法律研究领域,案件分析是一项复杂而繁琐的工作。传统的案件分析方法往往依赖于律师和法学家的经验和直觉,以及大量的文献查阅和案例对比。然而,随着人工智能(AI)技术的不断发展,AI知识库正逐渐成为法律研究的智能案件分析助手。本文将探讨AI知识库在法律研究中的应用,…

建筑设计优化:AI知识库在建筑设计中的创新应用

随着科技的飞速发展,人工智能(AI)已经渗透到各行各业,建筑设计领域也不例外。AI知识库作为一种高效的信息管理和应用工具,正在逐步改变建筑设计的传统模式,引领建筑设计进入一个新的优化时代。本文将探讨AI知识库在建筑设计中的创新应用,并分析其对设计效率、设计质量和…

Win32汇编学习笔记01.环境配置

Win32汇编学习笔记01.环境配置-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 环境配置 masm32下载 官网:http://www.masm32.com/安装成功标志环境配置:将masm32下的bin目录添加到path 新建include,将masm32目录下的inclcude目录添加进去 新建lib,将mas…

JVM实战—7.如何模拟GC场景并阅读GC日志

大纲 1.动手模拟出频繁Young GC的场景 2.JVM的Young GC日志应该怎么看 3.代码模拟动态年龄判定规则进入老年代 4.代码模拟S区放不下部分进入老年代 5.JVM的Full GC日志应该怎么看 6.问题汇总1.动手模拟出频繁Young GC的场景 (1)程序的JVM参数示范 (2)如何打印出JVM GC日志 (3)示…

DI入门 -2025/1/1

applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://…

Leetcode刷题第三天-二分查找

力口二分查找162、167、209、240162. 寻找峰值 - 力扣(LeetCode) 没二分,数组头尾分别插入最小值和最大值,比较num[i-1]<num[i]>num[i+1]class Solution:def findPeakElement(self, nums: List[int]) -> int:if not nums:return Nonemax_num,min_num=min(nums)-1,…

linux系统变量配置与脚本

一、为什么要配置linux的环境变量 添加环境变量之后可以直接在 termianl 中运行 shell 脚本、 可以在 运行 界面直接运行 shell 脚本 可以为命令添加别名等操作,方便输入指令 可以添加函数,方便将常用组合写成一条命令,比如git的提交操作,经典的三条指令二、如何配置linux环…

linux系统变量配置

一、为什么要配置linux的环境变量 添加环境变量之后可以直接在 termianl 中运行 shell 脚本、 可以在 运行 界面直接运行 shell 脚本 可以为命令添加别名等操作,方便输入指令 可以添加函数,方便将常用组合写成一条命令,比如git的提交操作,经典的三条指令二、如何配置linux环…

BUUCTF Misc刷题37

37、[BJDCTF2020]你猜我是个啥 随波逐流梭了

Vue 使用脚手架

一、安装脚手架npm install -g @vue/cli注意:安装过程有警告,安装完后,关闭窗口,重新打开cmd,输入vue,没有报错 二、切换到创建文件的目录,然后使用命令创建vue create vue_test耐心等待 三、启动项目npm run serve