代码

  1. 新建 socket.js , 将以下代码复制进去 ,向外暴露。

import api from '@/common/js/config.js' // 接口Api,图片地址等等配置,可根据自身情况引入,也可以直接在下面url填入你的 webSocket连接地址
class socketIO {constructor(data, time, url) {this.socketTask = nullthis.is_open_socket = false //避免重复连接this.url = url ? url : api.websocketUrl  //连接地址this.data = data ? data : nullthis.connectNum = 1 // 重连次数this.traderDetailIndex = 100 // traderDetailIndex ==2 重连this.accountStateIndex = 100 // traderDetailIndex ==1 重连this.followFlake = false // traderDetailIndex == true 重连//心跳检测this.timeout = time ? time : 15000 //多少秒执行检测this.heartbeatInterval = null //检测服务器端是否还活着this.reconnectTimeOut = null //重连之后多久再次重连}// 进入这个页面的时候创建websocket连接【整个页面随时使用】connectSocketInit(data) {this.data = datathis.socketTask = uni.connectSocket({url: this.url,success: () => {console.log("正准备建立websocket中...");// 返回实例return this.socketTask},});this.socketTask.onOpen((res) => {this.connectNum = 1console.log("WebSocket连接正常!");this.send(data)clearInterval(this.reconnectTimeOut)clearInterval(this.heartbeatInterval)this.is_open_socket = true;this.start();// 注:只有连接正常打开中 ,才能正常收到消息this.socketTask.onMessage((e) => {// 字符串转jsonlet res = JSON.parse(e.data);console.log("res---------->", res) // 这里 查看 推送过来的消息if (res.data) {uni.$emit('getPositonsOrder', res); }});})// 监听连接失败,这里代码我注释掉的原因是因为如果服务器关闭后,和下面的onclose方法一起发起重连操作,这样会导致重复连接uni.onSocketError((res) => {console.log('WebSocket连接打开失败,请检查!');this.socketTask = nullthis.is_open_socket = false;clearInterval(this.heartbeatInterval)clearInterval(this.reconnectTimeOut)uni.$off('getPositonsOrder')if (this.connectNum < 6) {uni.showToast({title: `WebSocket连接失败,正尝试第${this.connectNum}次连接`,icon: "none"})this.reconnect();this.connectNum += 1} else {uni.$emit('connectError');this.connectNum = 1}});// 这里仅是事件监听【如果socket关闭了会执行】this.socketTask.onClose(() => {console.log("已经被关闭了-------")clearInterval(this.heartbeatInterval)clearInterval(this.reconnectTimeOut)this.is_open_socket = false;this.socketTask = nulluni.$off('getPositonsOrder')if (this.connectNum < 6) {this.reconnect();} else {uni.$emit('connectError');this.connectNum = 1}})}// 主动关闭socket连接Close() {if (!this.is_open_socket) {return}this.socketTask.close({success() {uni.showToast({title: 'SocketTask 关闭成功',icon: "none"});}});}//发送消息send(data) {console.log("data---------->", data);// 注:只有连接正常打开中 ,才能正常成功发送消息if (this.socketTask) {this.socketTask.send({data: JSON.stringify(data),async success() {console.log("消息发送成功");},});}}//开启心跳检测start() {this.heartbeatInterval = setInterval(() => {this.send({"traderid": 10260,"type": "Ping"});}, this.timeout)}//重新连接reconnect() {//停止发送心跳clearInterval(this.heartbeatInterval)//如果不是人为关闭的话,进行重连if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this.followFlake)) {this.reconnectTimeOut = setInterval(() => {this.connectSocketInit(this.data);}, 5000)}}
}
module.exports = socketIO
  1. 在入口文件中 将 socketIO 挂载在 Vue 原型上 , 也可以按需引入置顶页面 。

import socketIO from '@/common/js/scoket.js'
Vue.prototype.$socketIo = new socketIO()
  1. 在需要用到webSocket的页面中使用如下方法(可根据自身业务需求进行整改)

scoketClose() {this.$socketIo.connectNum = 1const data = {"value1": "demo1""value2": "demo2"}this.$socketIo.send(data) // 这是给后端发送特定数据 关闭推送this.$socketIo.Close() // 主动 关闭连接 , 不会重连
},getWebsocketData() {// 要发送的数据包const data = {"value": "value1","type": "type1"}// 打开连接this.$socketIo.connectSocketInit(data)// 接收数据uni.$on("getPositonsOrder", (res) => {this.connect = trueconst {Code,data} = resif (Code == xxxx) {// 根据后端传过来的数据进行 业务编写。。。} else {}})// 错误时做些什么uni.$on("connectError", () => {this.connect = falsethis.scoketError = true})
}
  1. 离开页面,记得断开连接。

onUnload() {this.scoketClose()this.$socketIo.traderDetailIndex = 100 // 初始化 tabIndex
}

uni-app 封装 websocket 并且监听心跳机制相关推荐

  1. socket服务器断开消息,详解JS WebSocket断开原因和心跳机制

    1.断开原因 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来. ws.onclose = function (e) { console.log('websocket ...

  2. 云闪付APP内嵌H5监听左上角X关闭事件

    最近在做云闪付蓝牙对接,遇到的一个问题. 需求 用户进入云闪付APP内嵌 H5页面调用接口连上蓝牙后,可能不想支付使用,或其他原因,随手关闭左上角X关闭浏览器,这时需要监听这个动作,断开蓝牙连接,不然 ...

  3. Android app内截屏监听

    1.在 Application onCreate 方法设置 activity 生命周期监听 package com.example.myscreenshot;import android.app.Ac ...

  4. Rk安卓主板app开发之实时监听外部设备插入以及地址获取

    前言:在rk的主板上,因为是定制的东西,所以有些东西跟原生的有些不一样,比如监听外部设备的拔插以及地址获取 不废话了直接上代码:下面的是一个广播 package com.example.receive ...

  5. android 扫描枪封装,Android 扫码枪监听封装

    一.参考 1.常用keycode 一.简述 1.设备:扫码枪其实相当于一个物理输入设备,如果软键盘打开的话能明显感觉到其内容在输入 2.问题: 2.1.不能扫出中文来(可能和扫码枪设备,配置有关系) ...

  6. springboot心跳检测_springboot websocket 实时刷新 添加心跳机制(亲测可用版)

    思路 在我之前的一篇文章当中写到了websocket的实时刷新,但是有个问题没有解决,就是长时间没有数据的时候,这个连接就会自动断开,然后再次进行连接的话,需要再次进行连接.如果加入心跳机制的话,10 ...

  7. zookeeper 进行监听节点机制

    1) server端 在一个server启动时,如tomcat启动时,可以把在tomcat启动程序中,把当前tomcat服务写入到zookeeper 的 znode中(临时节点): 2) client ...

  8. android 监控app卸载,Android应用监听自身卸载

    [实例简介] 详情请参考我的博客:http://blog.csdn.net/allen315410/article/details/42521251 [实例截图] [核心代码] AppUninstal ...

  9. muduo网络库学习(二)对套接字和监听事件的封装Channel

    muduo对描述符fd,需要监听的事件events,当fd被激活调用的可读/可写/关闭/错误回调函数进行了封装,实现在Channel类中,Poller监听的其实就是一个个Channel对象,Chann ...

最新文章

  1. 解决POST数据时因启用Csrf出现的400错误
  2. 人力成本降低95%!这家上海AI独角兽,发布自动化机器学习平台,瞄准新基建...
  3. 关于GIT的SSH加密问题
  4. 经典C语言程序100例之二
  5. python控制手机自动刷新闻_python +adb控制手机自动化签到
  6. Python获得一篇文档的不重复词列表并创建词向量
  7. 培训学校计算机助教是干嘛的,【助教】的意思是什么?【助教】是什么意思?...
  8. 交换字典的key和value
  9. 计算机管理制度上墙,机房日常管理制度(上墙
  10. 笔记整理 之 ERROR 1336 (0A000)问题记录
  11. A - Round decimals
  12. slf4j的包使用说明
  13. 2017长乐国庆欢乐赛Day1
  14. 内网信息收集——工作组/域信息收集
  15. 关于如何使用C++读取.dbf文件
  16. 如何将png图片转为heif格式
  17. 关于OLED显示屏的理解
  18. Oxygen PDF Chemistry转换场景的处理器
  19. java 算数表达式 转成 二叉树,将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树。...
  20. IMail不能发送邮件的解决方法

热门文章

  1. 你对燕窝了解多少?2019上海燕窝展带您溯源燕窝
  2. PyTorch学习笔记:针对一个网络的权重初始化方法
  3. Microbiome:粪菌移植改善自闭症
  4. 客户视频|申银万国期货曹总:选择ZStack的3个关键因素
  5. 用opencv完成身份证识别
  6. 华为发布手机鸿蒙系统,承认华为鸿蒙很难?OPPO高管“嘲讽”鸿蒙,有何意图?...
  7. 集成多种协议、用于USBC端口的快充协议芯片IP2723
  8. vue项目下props传进去的数据,生命周期勾子函数包括watch不触发的解决办法
  9. java计算机毕业设计智慧公寓系统演示录屏2021源码+数据库+系统+lw文档
  10. DDR的FLY-BY拓扑中容性负载补偿