uniapp集成websocket不断线的处理-打牌记账

news2025/1/11 23:59:33

背景

近期在开发打牌记账微信小程序时,我们将房间这个业务场景做成了类似聊天室功能。

对房间内发生的动作,都能实时对其他人可见。 如:转账,离开,加入,结算等动作

其他人员都能实时接收到推送消息, 这个时候就需要websocket发挥作用。

但uniapp集成websocket 会出现断线的情况。

导致用户体验差,基经过一番排查,解决了异常。 感兴趣扫描下方小程序码在线体验.

a1.png

解决方法

请先阅读之前文章uniapp集成websocket的前后端代码了解集成步骤。

一般情况下,小程序是由多个页面构成的,那么这里就有两种情况:

你的长连接返回的数据只是某一个页面需要用到,其他页面都没有用到;

你的长连接返回的数据不止一个页面用到,而是多个页面,这种情况当然也可以包括第一种情况。

  • 单页面监听代码实现
var socket = null;

export default{

...

onShow(){

socket = uni.connectSocket({

     url: 'wss://www.example.com/socket', //仅为示例,并非真实接口地址。

     complete: ()=> {}

});

socket.onOpen(()=>{console.log('conn')});

socket.onMessage(res=>{...to do});//获取服务器传来的数据,做相应处理

socket.onClose(()=>{console.log('close')});

socket.onError((err)=>{console.log(err)})

},

onHide(){

socket.close();

},...

}

这样的效果是每次打开该页面,都会创建一个长连接,关闭该页面,都会关闭该连接。

如果你希望始终使用一个长连接,那么你可以把onShow()中的部分移到onLoad()中,但是你需要把onHide()中的关闭连接事件删除。
这样从第一次打开该页面开始,长连接就创建,此后始终保持,

但是如果小程序进入后台,这个长连接就会自动断开,重新打开小程序,onLoad()事件没有触发创建连接,所以你需要在onShow()中做一个心跳重连监测

以上是网上提供的思路, 下面是自己实践之后的代码

uniapp代码实现
onLoad(e) {
        console.log("on load");
        this.loadRoom(e);
},
onShow() {
        console.log("onShow");
        if(this.hasLogin && this.roomId != null){
                this.createWebsocket()
                console.log("---connect done--");
        }

},
destroyed() {
        if(this.socketTask != null){
                this.socketTask.closeConnect();
        }
        if(this.joinSocket != null){
                this.joinSocket.closeConnect();
        }
        if(this.offlineSocket != null){
                this.offlineSocket.closeConnect();
        }
        if(this.checkoutSocket != null){
                this.checkoutSocket.closeConnect();
        }
},
methods: {
    async loadRoom(e){
            await this.refreshMyToken();
            //根据机型调整房间人员框的高度
            this.getPersonBoxMaxHeight();
             //获取跳转携带的roomId:好友分享和微信扫一扫
             this.roomId = e.roomId;
             if(this.roomId === null || this.roomId === undefined || this.roomId === 'null'){
                     const scene = decodeURIComponent(e.scene)
                     this.roomId = scene.split("=")[1];
             }
             //进行登陆判断
             if(this.hasLogin === false){
                     this.$local.set("share_redirect_path", "/pages/index/room?roomId="+this.roomId);
                     uni.redirectTo({
                            url:'/pages/login/index'
                     })
                     return;
             }
             //加入房间
             this.joinRoom(this.roomId)

             //建立连接
             this.createWebsocket()

    },
    //建立ws链接
		createWebsocket(){
			if(this.socketTask == null){
				this.socketTask = new wsRequest(this.serviceUrl + "/jeecg-activiti-gateway/ws/push/"+this.roomId + "/"+ this.userInfo.id, 3000);
				this.watchSocket();
			}
			if(this.offlineSocket == null){
				this.offlineSocket = new  wsRequest(this.serviceUrl + "/jeecg-activiti-gateway/ws/offline/"+this.roomId + "/"+ this.userInfo.id, 3000);
				this.watchOfflineSocket();
			}
			if(this.joinSocket == null){
				this.joinSocket = new wsRequest(this.serviceUrl + "/jeecg-activiti-gateway/ws/join/"+this.roomId + "/"+ this.userInfo.id, 3000);
				this.watchJoinSocket();
			}
			
			if(this.checkoutSocket == null){
				this.checkoutSocket = new wsRequest(this.serviceUrl + "/jeecg-activiti-gateway/ws/checkout/"+this.roomId + "/"+ this.userInfo.id, 3000);
				this.watchCheckoutSocket();
			}
			
		},
  }

实现思路,在onLoad函数,我们就创建了websocket,并且实现了心跳机制检测。

此时,如果小程序退出,将执行destroyed函数将socket关闭

如果重新进入该页面,则会执行onShow函数,重新建立连接。 如此实现了不断连的效果。

参考

uniapp之微信小程序开发WebSocket

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

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

相关文章

自媒体多平台互助平台_互赞互关,视频快速起流

首先,视频爆流的关键规则是什么? 平台根据视频的点赞/评论数据计算视频热门程度, 视频播放留存与收藏等等也在考核范围内, 不过,互关互赞不一定符合推流!这你要清楚!! 目前我还不能准…

Doris【部署 03】Linux环境Doris数据库部署异常问题收集解决(不断更新)

Linux环境Doris数据库部署异常问题 1.FE1.1 Unknown system variable character_set_database1.2 notify new FE type transfer: UNKNOWN1.3 mysql_load_server_secure_path1.4 Only unique table could be updated1.5 too many filtered rows 2.BE2.1 Have not get FE Master …

vue项目报错:internal/modules/cjs/loader.js:892 throw err;

前言: vue项目中无法正常使用git,并报错情况。 报错信息: internal/modules/cjs/loader.js:892throw err;^ Error: Cannot find module D:\project\sd_wh_yth_front\node_modules\yorkie\src\runner.js 报错处理: npm install y…

【多模态融合】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

论文链接:Cross Modal Transformer: Towards Fast and Robust 3D Object Detection 代码链接:https://github.com/junjie18/CMT 作者:Junjie Yan, Yingfei Liu, Jianjian Sun, Fan Jia, Shuailin Li, Tiancai Wang, Xiangyu Zhang 发表单位…

运维笔记.MySQL.基于mysqldump数据备份与恢复

运维专题 MySQL.基于mysqldump数据备份与恢复 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: [email protected]. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_2855…

提升主播直播体验:如何选择和使用第三方美颜SDK?

第三方美颜SDK为开发者提供了实现这些功能的便利途径。那么,如何选择和使用第三方美颜SDK,来提升主播的直播体验呢? 一、了解美颜SDK的重要性 1.1美颜SDK的作用 美颜SDK不仅能提升主播的自信,还能吸引更多观众,增加…

“智绘艺术家之诗画点军”正式报名开赛 |AIGC与点军的梦幻碰撞,等你来战!

点军,这处江南的明珠,宜昌的瑰宝,历史与自然的交响乐章在此奏响。 三国时,关羽曾在此点兵,其雄姿英发,至今犹在眼前。 古之要塞,控巴夔,制荆襄,为三峡门户,…

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗,我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格,也可能听说过中文编程,但你有没有脑洞大开,想过如果把这两者结合起来,会碰撞出什么样的火花呢? 别不信,跟着我来看看吧&a…

【mysql】【docker】mysql8-互为主从

🌸🌸 Linux/docker-compose/mysql8 互为主从 优雅部署 🌸🌸 记录下两台Linux的mysql需要热备份,互为主从,后期加上keepalived实现高可用切换 参考博客:答 案 🌸 一、准备文件 这里…

Ubuntu18.04 OpenSSH升级

升级前版本: rootecs-m2eqyb:/opt# ll total 20912 drwxr-xr-x 2 root root 4096 May 10 16:23 ./ drwxr-xr-x 24 root root 4096 May 10 14:38 ../ -rw-r--r-- 1 root root 1848766 May 10 16:23 openssh-9.7p1.tar.gz -rw-r--r-- 1 root root 18038…

如何快速申请免费单域名SSL证书

申请免费的单域名SSL证书通常涉及以下几个步骤,虽然具体细节可能会根据不同的证书颁发机构(CA)有所差异。以下是通用的申请流程: 1.选择证书颁发机构: 访问提供免费单域名SSL证书的证书颁发机构网站,例如JoySSL等。 2.注册账号…

「51媒体」广西媒体资源,南宁活动媒体邀约

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 广西地区拥有丰富的媒体资源,在广西做活动,参加展览可以邀请他们到场采访报道。 央媒驻站:广西新华 广西人民 广西光明 广西央广 广西国际在线 广西中…

图形学初识--直线插值算法

文章目录 为什么需要插值算法?插值算法是什么?有哪些常见的插值算法呢?1. 线性插值(Linear Interpolation)2. 多项式插值(Polynomial Interpolation)3. 样条插值(Spline Interpolati…

使用宏实现,在EXCEL 打印后,将某个栏位数据自动+1

需求 在Excel中打印后,将某个栏位数据自动1。比如需要修改栏位数据为xxx-xx-1,打印后变为xxx-xx-2 实现: 打开Excel文件并按下Alt F11打开VBA编辑器。在VBA编辑器中,找到您的工作簿名称,比如VBAProject (YourWorkboo…

Discourse 中可能使用的 HMAC 算法 Java 实现

在 DiscourseConnect 中,对数据的签名使用的是 HMAC 算法。 实际使用的算法为 HmacSHA256。 Java 生成签名的方法很简单。 String hmac new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897682511405307018226").hmacHex(ssoPayload);HmacUti…

js中的 map 方法遍历

map方法// map 方法不改变原本的数组 所以要将map之后的值赋值给一个新的变量 // ...item 的作用是 // 将调用 map 函数的数组里的所有数据 都复制到新的,接收map之后的数组中 // 在此基础上 再覆盖或者添加新的数据,如 outpatient 和 recommended 属性/…

短视频矩阵管理系统:高效运营的智能解决方案

在数字化时代,短视频已成为内容传播和品牌推广的重要渠道。随着短视频平台的不断涌现,如何高效管理和运营多个账号,成为了许多企业和个人面临的问题。短视频矩阵管理系统应运而生,它通过一系列智能化功能,为短视频的创…

高仿果汁导航模板

参考原文:果汁导航风格模板_1234FCOM专注游戏工具及源码例子分享 极速云

Prometheus 聚合查询的两个方案

问题背景 多个 Prometheus 集群或者多个 VictoriaMetrics 集群,在 Grafana 和夜莺里通常需要创建多个不同的数据源,这也就意味着,数据没法聚合查询,比如统一做一下 sum 之类的运算会比较麻烦,本文讲述两种 Prometheus…

数字营销:以大数据作引擎,推动企业全面数字化升级

数字营销本质乃是以大数据为核之心,促使营销活动高效运作,消费者线上线下数据的无缝衔接、企业内外部数据的贯通、公域引流私域运营等,皆已成为企业运营的标准配置。 数据即等同于市场,市场即等同于用户,用户乃是企…