1.  websocket.js   封装代码

  1. //是否已经连接上ws
  2. let isOpenSocket = false
  3. //心跳间隔,单位毫秒
  4. let heartBeatDelay = 3000
  5. let heartBeatInterval = null
  6. //心跳时发送的消息文本
  7. let heartBeatText = "PING"
  8. //最大重连次数
  9. let reconnectTimes = 10
  10. let reconnectInterval = null
  11. //重连间隔,单位毫秒
  12. let reconnectDelay = 3000
  13.  
  14. let wsUrl = "ws://xxxxxxxxxxxx" //ws请求 或者 wss
  15. let socketTask = null
  16.  
  17. //这个参数是防止重连失败之后onClose方法会重复执行reconnect方法,导致重连定时器出问题
  18. //连接并打开之后可重连,且只执行重连方法一次
  19. let canReconnect = false
  20.  
  21. //封装的对象,最后以模块化向外暴露,
  22. //init方法 初始化socketTask对象
  23. //completeClose方法 完全将socketTask关闭(不重连)
  24. //其他关于socketTask的方法与uniapp的socketTask api一致
  25. let ws = {
  26. socketTask: null,
  27. init,
  28. completeClose,
  29. send
  30. }
  31.  
  32. function init() {
  33. socketTask = uni.connectSocket({
  34. url: wsUrl,
  35. complete: (res)=> {console.log("WebSocket连接成功",res)}
  36. })
  37. socketTask.onOpen((res) => {
  38. console.log("WebSocket连接已打开",res)
  39. clearInterval(heartBeatInterval)
  40. clearInterval(reconnectInterval)
  41. isOpenSocket = true
  42. canReconnect = true
  43. //开启心跳机制 向websocket发送数据,json格式,参数:sceneId
  44. heartBeat()
  45. })
  46. socketTask.onMessage((res) => {
  47. // 每次返回的数据不一样,需要加入判断
  48. console.log('收到服务器内容',JSON.parse(res.data))
  49. let result = JSON.parse(res.data)
         //这边可以根据推送的数据, 做相应的 do somethings, 根据自己需求, 下面只是例子..
  50. // token存在,说明,小程序用户点击了授权(比如推送的数据有token,那就做什么事xxxx
  51. if(result.token){
  52. uni.setStorageSync('token', result.token)
  53. uni.setStorageSync('userInfo', JSON.stringify(result.userInfo))
  54. }
  55. // client_id存在,说明连websocket接成功
  56. if(result.msg=="连接成功"){
  57. uni.setStorageSync('client_id', result.data.client_id);
  58. }
  59. // JSON.parse(res.data).msg=="已归还导览机", 已归还导览机,清空用户缓存
  60. if(result.msg=="已归还导览机"){
  61. // 返回首页,清空数据
  62. uni.clearStorageSync();
  63. uni.navigateBack({
  64. delta: 100
  65. })
  66. }
  67.  
  68. })
  69. socketTask.onClose(() => {
  70. if(isOpenSocket){
  71. console.log("ws与服务器断开")
  72. }else{
  73. console.log("连接失败")
  74. }
  75. isOpenSocket = false
  76. if(canReconnect){
  77. reconnect()
  78. canReconnect = false
  79. }
  80. })
  81. ws.socketTask = socketTask
  82. }
  83.  
  84. function heartBeat() {
  85. heartBeatInterval = setInterval(() => {
  86. // console.log(heartBeatText)
  87. uni.getSystemInfo({
  88. success: function (res) {
  89. console.log('设备id----',res.deviceId);//设备id
  90. uni.setStorageSync('deviceId', res.deviceId)
  91. let obj = {
  92. sceneId:res.deviceId
  93. }
  94. send(JSON.stringify(obj));
  95. }
  96. });
  97.  
  98. }, heartBeatDelay)
  99. }
  100.  
  101. // 发送消息
  102. function send(value) {
  103. ws.socketTask.send({
  104. data: value,
  105. async success(res) {
  106. console.log("消息发送成功",res)
  107. }
  108. });
  109. }
  110. function reconnect() {
  111. //停止发送心跳
  112. clearInterval(heartBeatInterval)
  113. //如果不是人为关闭的话,进行重连
  114. if (!isOpenSocket) {
  115. let count = 0;
  116. reconnectInterval = setInterval(() => {
  117. console.log("正在尝试重连")
  118. init();
  119. count++
  120. //重连一定次数后就不再重连
  121. if(count >= reconnectTimes){
  122. clearInterval(reconnectInterval)
  123. console.log("网络异常或服务器错误")
  124. }
  125. }, reconnectDelay)
  126. }
  127. }
  128. function completeClose(){
  129. //先将心跳与重连的定时器清除
  130. clearInterval(heartBeatInterval)
  131. clearInterval(reconnectInterval)
  132. canReconnect = false
  133. ws.socketTask.close()
  134. }
  135.  
  136. module.exports = ws

2. 使用时在main.js引入并绑定在Vue的prototype上,这样就可以做到全局变量了
main.js

  1. import ws from 'ws.js' //找好自己的路径
  2. Vue.prototype.$ws = ws

3. 页面调用

比如在 A页面调用

  1. onLoad() {
  2. let _this = this;
  3. _this.$ws.init()//初始化websocket
  4. }

4. 里面封装的  send方法等也都可以用  // this.$ws.send(JSON.stringify(obj))

更多参考链接

uniapp中websokcet封装和使用的更多相关文章

  1. uniapp中拿到base64转blob对象,或base64转bytes字节数组,io操作写入字节流文件bytes

    1. uniAPP中拿到附件的base64如何操作,如word文件 /*** 实现思路:* 通过native.js的io操作创建文件,拿到平台绝对路径* 再通过原生类进行base64解码,拿到字节流b ...

  2. Java中的封装

    在前面的一些日子里,一只都在学习C#语言,使用C#在做一些小项目的,今天转到了Java的学习,还是感觉有点的不习惯,没有以前的中文界面的,全是英文.写起代码来都一直保持着C#中的编码的习惯,但是学习J ...

  3. C++内存中的封装、继承、多态(下)

    上篇讲述了内存中的封装模型,下篇我们讲述一下继承和多态. 二.继承与多态情况下的内存布局 由于继承下的内存布局以及构造过程很多书籍都讲得比较详细,所以这里不细讲.重点讲多态. 继承有以下这几种情况: ...

  4. C++内存中的封装、继承、多态(上)

    C++内存中的封装.继承.多态(上) 继我的上一篇文章:浅谈学习C++时用到的[封装继承多态]三个概念 此篇我们从C++对象内存布局和构造过程来具体分析C++中的封装.继承.多态. 一.封装模型的内存 ...

  5. Uni-app中Class绑定与Style绑定

    为了节约性能,我们将Class与Style的表达式通过compiler硬编码到uni-app中 支持语法和转换效果如下: Class支持语法: <view :class="{ acti ...

  6. Struts2把数据封装到集合中之封装到Collection中

    数据封装到集合中,可以封装到集合中,也可以封装到Map中.该篇博客主要讲解数据封装到集合中的封装到Collection中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) ...

  7. 如何在Javascript中利用封装这个特性

    对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...

  8. 2018.2.2 JavaScript中的封装

    JavaScript中的封装 1.封装的概念 通过将一个方法或者属性声明为私用的,可以让对象的实现细节对其他对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束,这样可以使代码 ...

  9. 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi

    优雅的在WinForm/WPF/控制台 中使用特性封装WebApi 说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpL ...

随机推荐

  1. 第五篇- 抖音的强大对手来了,用Flutter手撸一个抖音国际版,看看有多炫

    前言 由于中间几个月项目天天加班,导致没没时间更新,最近一段时间对前端进行了重构,加了很多页面,如登录.注册.关注.个人中心等,目前写这个纯属业余个人爱好,所以断断续续的继续在做...... 前端地址 ...

  2. tensorflow core 核心目标依赖图

    Tensorflow的核心代码在core模块中,56w行的代码量让人望而生畏,熟悉了bazel工具之后,发现BUILD文件是理清代码结构的很好的资源,但使用bazel query语法提取出来//ten ...

  3. 内网穿透工具--frp

    对于没有公网 IP 的内网用户来说,远程管理或在外网访问内网机器上的服务是一个问题. 今天给大家介绍一款好用内网穿透工具 FRP,FRP 全名:Fast Reverse Proxy.FRP 是一个使用 ...

  4. SMB共享配置

                                                                   SMB 使用命令挂载和卸载SMB文件系统 自动挂载SMB文件系统 红帽企业 ...

  5. 三层PetShop架构设计

    <解剖 PetShop >系列之一 前言:   PetShop 是一个范例,微软用它来展示 .Net 企业系统开发的能力.业界有许多 .Net 与 J2EE 之争,许多数据是从微软的 Pe ...

  6. 有限差分法(Finite Difference Method)解方程:边界和内部结点的控制方程

    FDM解常微分方程 问题描述 \[\frac{d^2\phi}{dx^2}=S_{\phi} \tag{1} \] 这是二阶常微分方程(second-order Ordinary Differenti ...

  7. SpringAOP--代理

    前言 在Spring或者SpringBoot中,可以通过@Aspect注解和切点表达式等配置切面,实现对某一功能的织入.然而其内部到底是如何实现的呢? 实际上,Spring在启动时为切点方法所在类生成 ...

  8. 什么是 YAML?

    YAML 是一种人类可读的数据序列化语言.它通常用于配置文件. 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加 结构化,而且更少混淆.可以看出 YAML 具有分层配置数据 ...

  9. mq 的缺点 ?

    系统可用性降低 系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的 接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ ...

  10. 在JAVA中如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环.