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

背景

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

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

其他人员都能实时接收到推送消息, 这个时候就需要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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android模块化项目搭建和模块之间跳转传值(1)

一、背景 近段时间 由于工作没有这么繁忙,于是总结了一下项目中的模块化处理,并且这也是在众多面试中会问到的问题,希望能够帮助到在学习或者了解模块化的同学。 二、项目搭建 1、其实模块化就是将众多功能模块分成一个一个的模块进行开发…

<项目> 云备份

目录 一、简单认识 二、实现目标 三、服务端程序负责功能及功能模块划分 四、客户端程序负责功能及功能模块划分 五、环境搭建 (一)gcc 7.3 (二)安装jsoncpp库 (三)下载bundle数据压缩库 &#xf…

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。 官方介绍:https://jwt.io/intr…

添加、修改和删除列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。 …

vs无法打开或包括文件”QTxxx“

vs创建项目时默认引入core、gui、和widgets等模块,在需要网络通讯或者图表等开发时需要添加相应模块。 点击扩展 -> QT VS Tools -> QT Project Setting->Qt Modules,添加相应模块即可

【Jenkins】Centos7安装Jenkins(环境:JDK11,tomcat9,maven3.8)

目录 Jenkins部署环境Maven安装1.上传安装包2.解压3.配置Maven环境变量4.使配置文件立即生效5.校验Maven安装6.Maven配置阿里云仓库7.Maven配置依赖下载位置 Git安装安装监测安装 JDK17安装1.查看旧版本JDK2.卸载旧版本JDK3.查看是否卸载干净4.创建java目录5.下载JDK11安装包6.…

kettle从入门到精通 第六十二课 ETL之kettle job中发送邮件(带多个附件),闭坑指南

1、今天群里一个朋友加我微信遇到问下向我求助。一顿测试下来发现原来是使用kettle姿势不对,对kettle没有完全驾驭导致的,今天和大家一起分享下这个问题。 2、先自我膨胀下,自从写kettle系列文章之后认识了很多朋友,同时文章也帮助…

设计模式6——单例模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 单例模式(Singleto…

1-4月我国5G用户、流量占比均过半,呈现平稳增长态势!

1-4月份,通信行业整体运行平稳。电信业务量收平稳增长;5G、千兆光网等新型基础设施建设持续推进,网络连接用户规模不断扩大,移动互联网接入流量较快增长。 一、总体运行情况 电信业务收入稳步增长,电信业务总量增速保持…

vue3.0(十)双向数据绑定原理和v2.0对比

文章目录 MVVM框架1 理解ViewModel2 MVVM的优点 vue2.0 双向数据绑定原理1 实现双向数据绑定2 实现3 Vue2.0 缺点和解决办法 vue3.0 双向数据绑定原理vue2.0和vue3.0 的差异Vue2.0Vue3.0Object.defineProperty和Proxy的对比 MVVM框架 MVVM(Model-View-ViewModel&am…

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

欢聚笔试题求助帖

事情是这样的,这段时间一直在求职投简历,期望在暑假之前接到一份大数据开发的实习工作。投了很多公司,然后就收到了欢聚的笔试邀约,HR说要我一天之内做出来,恰巧第二天还有组会要汇报,我就先放下了&#xf…

21.1zabbix低级自动发现-监控项详解

详解分析:低级自动发现:自动创建监控项(红色部分字体是怎么创建得监控项?) 点击对应得主机-监控项-Network interfaces应用集,键值有进4个,出4个。因为本机存在4块网卡 注释:本机存…

BGP(一)边界网关协议

BGP协议基础 路由分类 直连路由 非直连路由(间接路由) 静态路由动态路由 IGP:内网网关路由协议(在企业内部或数据中心内部使用) DV:距离矢量路由协议RIP(v1/v2)IGRP——网络直径&…

文本转语音软件-TTSMaker

一、TTSMaker介绍 TTSMaker(马克配音)是一款免费的文本转语音工具,提供语音合成服务,支持多种语言,包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言,以及超过300种语音风格。 可…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录,本篇博客记录数组基础1部分的题目,主要题目包括: 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位…

(二)vForm 动态表单设计器之下拉、选择

系列文章目录 (一)vForm 动态表单设计器之使用 目录 系列文章目录 前言 一、后端需提供接口 二、组件配置 总结 前言 动态表单下拉、选择等组件,大概率要使用数据库中的数据,那么vForm如何拿到数据库中的数据呢?跟随…

Xed编辑器开发第二期:使用Rust从0到1写一个文本编辑器

第三篇 这部分接着处理用户退出命令以及一些其他新功能; 3.1 使用CtrlQ退出 modifiers: event::KeyModifiers::CONTROL,使用CONTROL替换之前的NONE值即可; 3.2 重构键盘输入 让我们重构我们的代码,以便我们有一个用于低级按键读取的函数&…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞,我刷题还是太少了,所以很多例子来自ctfshow,以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中,有两中判断相等的符号,和&…

flutter使用dbus插件时,在终端无法使用“dart-dbus”命令

不用flutter的人,可能都不会找到这儿,遇到这个问题,所以这里默认flutter已经装过了,且对flutter如何使用插件也有所了解了。 由于我在项目中用到了dbus插件,用法如图所示,我需要使用这条命令来生成一个sou…