当前位置: 首页 > news >正文

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

相关文章:

  • 实战:生成个性化词云的Python实践【7个案例】
  • 六种常用设计模式
  • QT状态机10-QKeyEventTransition和QMouseEventTransition的使用
  • 海外仓储管理系统:提升效率,标准化海外仓管理,科技赋能业务
  • 学习Uni-app开发小程序Day17
  • 前端请求超时截断,axios timeout设置未生效情况记录
  • k8s笔记 | helm包管理
  • Spring 事务源码分析
  • Docker配置国内镜像源
  • 匿名内部类(重点)
  • Linux磁盘高级操作
  • 计算机网络数据链路层知识点总结
  • OpenHarmony集成OCR三方库实现文字提取
  • golang中的位运算 << >> ^ 高位数,低位数示例
  • 有趣的css - 两个圆形加载效果
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTML-表单
  • Idea+maven+scala构建包并在spark on yarn 运行
  • js算法-归并排序(merge_sort)
  • 读懂package.json -- 依赖管理
  • 分享几个不错的工具
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 离散点最小(凸)包围边界查找
  • 前端设计模式
  • 数据科学 第 3 章 11 字符串处理
  • 详解NodeJs流之一
  • 一天一个设计模式之JS实现——适配器模式
  • 原生 js 实现移动端 Touch 滑动反弹
  • 再次简单明了总结flex布局,一看就懂...
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • AI算硅基生命吗,为什么?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $L^p$ 调和函数恒为零
  • (WSI分类)WSI分类文献小综述 2024
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十三)Maven插件解析运行机制
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原)本想说脏话,奈何已放下
  • ***详解账号泄露:全球约1亿用户已泄露
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net Remoting常用部署结构
  • .NET框架
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色