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

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

时间:2025-01-01 23:18:29浏览次数:1  
标签:uniapp console log socket WebSocket data id 服务端 客户端

page code

<template>
    <view class="container">
        /////
    </view>
</template>

<script>
    
    import socket  from '@/util/socket';
    export default {
        data() {
            return {
                
            };
        },
        onl oad() {
            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 响应');
            }
        });

        // 绑定 one rror 事件
        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 并设置为 null
        if (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
};

 

标签:uniapp,console,log,socket,WebSocket,data,id,服务端,客户端
From: https://www.cnblogs.com/wt645631686/p/18646498

相关文章

  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • Vue.js组件开发-客户端如何限制刷新Token次数
    在Vue.js组件开发中,限制刷新Token的次数是一个重要的安全措施,可以防止恶意用户或攻击者无限次尝试刷新Token。客户端限制在客户端,可以通过Vuex、localStorage或sessionStorage等存储机制来跟踪刷新Token的尝试次数。以下是一个基本的实现步骤:‌1.定义状态‌:在Vuexstore中......
  • 基于SSM+Uniapp的大学生科技竞赛管理系统微信小程序设计与实现
    ......
  • 对Sentinel的链路分析与客户端服务端交互理解
    Sentinel介绍略https://sentinelguard.io/zh-cn/https://github.com/alibaba/Sentinelhttps://sentinelguard.io/zh-cn/docs/quick-start.htmlhttps://github.com/alibaba/Sentinel/wiki/Sentinel-核心类解析Sentinel定义的术语Entry:表示对某个资源的访问请求,通过SphU.e......
  • 为Feign客户端自定义ErrorDecoder
    摘要:重写Feign的错误解码器ErrorDecoder,以自定义业务逻辑。  ErrorDecoder,顾名思义,它是发生错误或者异常情况时使用的一种解码器,允许我们对异常进行特殊处理。  在配置Feign客户端时,通过自定义错误解码器ErrorDecoder可以让我们自由自在地决定如何处理来自服务器的错误响应......
  • 解决uniapp安卓打包targetSdkVersion报错
    解决GooglePlay版本检查问题的实用方案。Error:GooglePlayrequiresthatappstargetAPIlevel33orhigher.[ExpiredTargetSdkVersion]问题描述打包时遇到以下错误:Error:GooglePlayrequiresthatappstargetAPIlevel33orhigher.[ExpiredTargetSdkVersion]......
  • uniapp请求封装-token无感刷新
    当前是vue3+ts版本的封装vue3+js版本请求封装可参考https://www.cnblogs.com/lovejielive/p/14343619.htmltoken无感刷新,可自行删除requset.ts中ts相关数据恢复vue2版本先在目录下创建utils和common这2个文件夹utils是存放工具类的,common用来放置常用方法的之后......
  • hhdb客户端介绍(65)
    功能模块实现数据库对象管理功能模块技术实现细节前端技术:在数据库对象管理窗口中,使用QTreeView组件来展示数据库对象的树形结构。通过自定义数据模型(继承自QAbstractItemModel)来加载和管理数据库对象的数据,包括数据库、表、视图、存储过程等。根据不同的数据库对象类型,设......
  • hhdb客户端介绍(64)
    功能模块实现连接管理功能模块技术实现细节前端技术:采用基于Qt的界面开发框架,利用其丰富的UI组件库构建连接管理窗口。例如,使用QLineEdit组件来实现服务器地址、端口号、用户名和密码等信息的输入框,通过QPushButton组件创建连接按钮、测试按钮以及各种辅助功能按钮(如......
  • uniapp使用uView2.x的自定义导航栏时,在app端出现同时两个导航栏的问题
    在使用自定义导航栏时,先是发现在h5端同时显示两个导航栏的问题.经查已成功解决,详见我的上一篇文章(在app.vue的onLoad内加上uni.hideTabBar();).但是运行到安卓真机后发现还是存在同样的情况,出现了原生底部导航栏与自定义导航栏同时出现的情况.再次经过查询得到答案,同样在a......