目录

  • 1,前言
  • 2,代码实现
  • 3,使用
    • 3.1,初始化
    • 3.2,发送消息
    • 3.3,接收消息
    • 3.4,断线重连

1,前言

最近在做IOT的项目,里面有个小程序要用到webSocket,借这个机会,封装了一个uniapp小程序适用的Socket类,包括断线重连,心跳检测等等,具体实现如下。

2,代码实现

class webSocketClass {constructor(url, time) {this.url = urlthis.data = nullthis.isCreate = false // WebSocket 是否创建成功this.isConnect = false // 是否已经连接this.isInitiative = false // 是否主动断开this.timeoutNumber = time // 心跳检测间隔this.heartbeatTimer = null // 心跳检测定时器this.reconnectTimer = null // 断线重连定时器this.socketExamples = null // websocket实例this.againTime = 3 // 重连等待时间(单位秒)}// 初始化websocket连接initSocket() {const _this = thisthis.socketExamples = uni.connectSocket({url: _this.url,header: {'content-type': 'application/json'},success: (res) => {_this.isCreate = trueconsole.log(res)},fail: (rej) => {console.error(rej)_this.isCreate = false}})this.createSocket()}// 创建websocket连接createSocket() {if (this.isCreate) {console.log('WebSocket 开始初始化')// 监听 WebSocket 连接打开事件try {this.socketExamples.onOpen(() => {console.log('WebSocket 连接成功')this.isConnect = trueclearInterval(this.heartbeatTimer)clearTimeout(this.reconnectTimer)// 打开心跳检测this.heartbeatCheck()})// 监听 WebSocket 接受到服务器的消息事件this.socketExamples.onMessage((res) => {console.log('收到消息')uni.$emit('message', res)})// 监听 WebSocket 连接关闭事件this.socketExamples.onClose(() => {console.log('WebSocket 关闭了')this.isConnect = falsethis.reconnect()})// 监听 WebSocket 错误事件this.socketExamples.onError((res) => {console.log('WebSocket 出错了')console.log(res)this.isInitiative = false})} catch (error) {console.warn(error)}} else {console.warn('WebSocket 初始化失败!')}}// 发送消息sendMsg(value) {const param = JSON.stringify(value)return new Promise((resolve, reject) => {this.socketExamples.send({data: param,success() {console.log('消息发送成功')resolve(true)},fail(error) {console.log('消息发送失败')reject(error)}})})}// 开启心跳检测heartbeatCheck() {console.log('开启心跳')this.data = { state: 1, method: 'heartbeat' }this.heartbeatTimer = setInterval(() => {this.sendMsg(this.data)}, this.timeoutNumber * 1000)}// 重新连接reconnect() {// 停止发送心跳clearTimeout(this.reconnectTimer)clearInterval(this.heartbeatTimer)// 如果不是人为关闭的话,进行重连if (!this.isInitiative) {this.reconnectTimer = setTimeout(() => {this.initSocket()}, this.againTime * 1000)}}// 关闭 WebSocket 连接closeSocket(reason = '关闭') {const _this = thisthis.socketExamples.close({reason,success() {_this.data = null_this.isCreate = false_this.isConnect = false_this.isInitiative = true_this.socketExamples = nullclearInterval(_this.heartbeatTimer)clearTimeout(_this.reconnectTimer)console.log('关闭 WebSocket 成功')},fail() {console.log('关闭 WebSocket 失败')}})}
}export default webSocketClass

3,使用

直接实例化封装的socket类,调用initSocket初始化就行了,当收到消息的时候,会触发全局$emit事件,只需要使用$on监听message事件就行。

3.1,初始化

我这边在globalData里面定义了socketObj全局变量,在首页onShow生命周期里面判断当前是否已经初始化了socket实例,再进行操作。

home.vue

import WebSocketClass from '../../utils/webSocket'
const app = getApp()onShow() {// 如果已登陆,则启用WebSocketif (app.globalData.user && app.globalData.user.sToken) {// 如果已经有sockt实例if (app.globalData.socketObj) {// 如果sockt实例未连接if (!app.globalData.socketObj.isConnect) {app.globalData.socketObj.initSocket()}} else {// 如果没有sockt实例,则创建const data = app.globalData.userconst path = `/websocket/notify/${data.userId}`app.globalData.socketObj = new WebSocketClass(`${app.globalData.socketUrl}${path}?token=${data.userToken}&refreshToken=${data.sToken}`,60)app.globalData.socketObj.initSocket()}}
}

3.2,发送消息

methods: {sendMessage() {const param = { value: '我是一个消息' }app.globalData.socketObj.sendMsg(param)}
}

3.3,接收消息

// 开启监听
onLoad() {uni.$on('message', this.getMessage)
},
// 页面卸载时取消监听
onUnload() {uni.$off('message', this.getMessage)
},
methods: {// 接收到消息的回调getMessage(msg) {console.log(msg)}
}

3.4,断线重连

断线会自动重连。


如果看了觉得有帮助的,我是@鹏多多i,欢迎 点赞 关注 评论;
END

公众号

往期文章

  • vue3+element-plus配置cdn
  • 助你上手Vue3全家桶之Vue3教程
  • 助你上手Vue3全家桶之VueX4教程
  • 助你上手Vue3全家桶之Vue-Router4教程
  • 超详细!Vue的九种通信方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令
  • 超详细!Vue-Router手把手教程

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

uniapp小程序webSocket封装、断线重连、心跳检测相关推荐

  1. uniapp写小程序组件封装修改数据不渲染

    uniapp写小程序组件封装修改数据不渲染 数据通过props传进来的,对数据进行修改,js打印是有修改的,但是页面无变化,最好找的原因,props传入的数据是不能去直接操作的,可以使用其他方法,比如 ...

  2. uniapp小程序商城开发thinkphp6积分商城、团购、秒杀 封装APP

    uniapp小程序商城开发thinkphp6积分商城.团购.秒杀 封装APP,后台是vue开发 需要源代码的可以联系我,找我要哦 <template><view v-if=" ...

  3. uniapp 小程序封装左滑效果组件

    uniapp 小程序封装左滑效果组件 引言 封装组件 页面使用 注意事项 引言 小程序电商项目购物车,往往都会有左滑删除功能,在不想使用插件的前提下,就需要自己编写,因此我个人写了一个左滑效果组件 封 ...

  4. vue、uniapp 小程序点击事件禁止多次点击方法封装

    vue.uniapp 小程序点击事件禁止多次点击方法封装 在写uniapp 小程序时发现个bug,疯狂点击按钮第一点击事件还没执行完就疯狂多次调用该事件,很是影响用户体验以及消耗性能,所以这里我封装个 ...

  5. 微信小程序WebSocket心跳检测与断来重连

    为什么要心跳检测 使用微信小程序WebSocket时,WebSocket在一定的时间没有进行通信就会断开连接,所以需要使用心跳检测. 那么心跳检测是什么呢,心跳检测顾名思义就是和人心脏动一样,客户端在 ...

  6. 微信小程序WebSocket相关问题说明

    看本帖的前提是:你的WebSocket在小程序之外是正常可用的:因为WebSocket不是小程序独有的,所有大部分问题在网上是可以找到说明的,本帖只是聚合了一些小程序中使用WebSocket中遇到的问 ...

  7. uniapp 小程序车牌号输入键盘

    之前写微信小程序时封装了车牌号输入键盘,记录在微信小程序组件中了,最近开发uniapp又重新开发了车牌号输入键盘组件,是在微信小程序开发的键盘组件的思想上做了一版优化,增加了挂车车牌号输入,及新能源车 ...

  8. uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式

    文章目录 uniapp 小程序 APP 实现手写板 签名 画图 canvas 保存为图片格式 一.手写板 1.H5代码 2.JS代码 总结 uniapp 小程序 APP 实现手写板 签名 画图 can ...

  9. 微信小程序websocket实现即时聊天

    今天给大家分享一下本人做小程序使用websocket的一点小经验,希望对大家有所帮助. 使用之前肯定首先要了解一下websocket是什么,简单来讲websocket就是客户端与服务器之间专门建立的一 ...

  10. 微信小程序WebSocket 中实现发送文字,图片,语音以及WebSocket 常见问题解决方案

    小程序 WebSocket 常见问题:(本文已解决的) 1.自动断开链接,重连但是只能存在两个 WebSocket 的问题.   ---1兼容情况:1.1 正常聊天过一段时间 WebSocket 自动 ...

最新文章

  1. 仅用六个字符来完成Hello World,你能做到吗?
  2. 158行代码!程序员复现DeepMind图像生成神器
  3. 阿里巴巴开源Weex 开发教程
  4. IOS 打包证书签名 shell脚本
  5. r语言rank降序_R语言rank函数详细解析
  6. Access字段类型“查阅向导”
  7. 第二节20181110
  8. java计算机毕业设计HTML5旅游网站源码+mysql数据库+系统+lw文档+部署
  9. 马克思主义基本原理概述
  10. linux Guest账户下如何更新默认的python版本
  11. C# Dictionary多线程安全访问问题
  12. 如何制作一封高打开率的邮件?
  13. 七牛云配置怎么配CDN
  14. Your account has been flagged. Because of that, your profile is hidden from the public. If you belie
  15. 计算机科学与昆虫,基于视觉的昆虫物种识别算法研究
  16. 区块链改革杭州闭门会议——分享链改机遇,探讨价值联动!
  17. xp未受用户在此计算机登录,XP系统无线网络连接受限制或无连接的解决办法
  18. WRF模式的安装与运行
  19. R语言 stringr包
  20. 查看ThinkPad主机编号的五种方法

热门文章

  1. MessageDigest 类的用法
  2. 2021年第十二届蓝桥杯javaB组真题及部分答案
  3. 测试后台管理系统思路和方法
  4. CI框架 url指向错误 配置根目录
  5. 易用宝项目记录day7-权限与菜单
  6. android两个popwindow背景,Android PopWindow 设置背景亮度的实例
  7. Android手机RTMP播放工具(APK,支持秒开)
  8. 计算机毕业设计(18)java毕设作品之旅游景区景点售票购票系统
  9. 微博黄V怎么认证:如何快速获得微博认证?
  10. JAR文件概述(2021版)