小程序websocket心跳库(websocket-heartbeat-miniprogram)


Posted in Javascript onFebruary 23, 2020

前言

在16年的时候因为项目接触到websocket,而后对心跳重连做了一次总结,写了篇博客,而后18年对之前github上的demo代码进行了再次开发和开源,最终封装成库。如下:

github: https://github.com/zimv/websocket-heartbeat-js
npm: https://www.npmjs.com/package/websocket-heartbeat-js

在2020年也就是今年初,同事建议说可以考虑兼容一下小程序,心想也挺好的。便有了今天的 websocket-heartbeat-miniprogram,这次基于以前的代码新建了一个项目,只做小程序的版本,因为涉及到各种小程序以及相关框架的兼容,觉得还是单独出一个包,更专注一点。

介绍

websocket-heartbeat-miniprogram基于小程序的websocket相关API进行封装,主要目的是保障客户端websocket与服务端连接状态。该程序有心跳检测及自动重连机制,当网络断开或者后端服务问题造成客户端websocket断开,程序会自动尝试重新连接直到再次连接成功。兼容市面上大部分小程序微信,百度,支付宝等,只要都是统一的小程序weboscket-API规范。也支持小程序框架比如Taro等。无论如何,业务是需要一层心跳机制的,否则一些情况下会丢失连接导致功能无法使用。

用法

安装

npm install --save websocket-heartbeat-miniprogram

引入使用

import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
  miniprogram: wx,
  connectSocketParams: {
    url: 'ws://xxx'
  }
})
  .then(task => {
    task.onOpen = () => {//钩子函数
      console.log('open');
    };
    task.onClose = () => {//钩子函数
      console.log('close');
    };
    task.onError = e => {//钩子函数
      console.log('onError:', e);
    };
    task.onMessage = data => {//钩子函数
      console.log('onMessage', data);
    };
    task.onReconnect = () => {//钩子函数
      console.log('reconnect...');
    };
    task.socketTask.onOpen(data => {//原生实例注册函数,重连后丢失
      console.log('socketTask open');
    });
    task.socketTask.onMessage(data => {//原生实例注册函数,重连后丢失
      console.log('socketTask data');
    });
  })

本程序内部总是使用小程序connectSocket方法进行socket连接,如果socket断开,本程序内部会再次执行小程序的connectSocket方法,以此来重新建立连接,重连都会建立新的小程序socket实例。

WebsocketHeartbeat方法返回一个promise,返回的task对象是本程序的一个实例,提供了onOpen,onClose,onError,onMessage,onReconnect等钩子函数。也暴露了小程序本身的实例(socketTask),task.socketTask就是小程序connectSocket返回的实例,而task.socketTask是小程序的原生实例,它们通过onXXX方法传递函数进行监听注册,在socket重连以后,内部重新通过connectSocket新建实例,将会返回新的小程序原生实例,因此之前通过socketTask.onXXX注册的这些函数将会丢失。而本程序内部提供的钩子函数重连上以后依然有效。大部分情况下推荐就使用本程序的钩子函数。

支付宝小程序差异

支付宝小程序只允许同时存在一个socket连接,原生的API也和其他小程序有一点小差异,本程序已经做了兼容,但是还是要注意支付宝只允许建立一个socket,如果建立多个socket,前面的socket都会被系统关闭,一定要通过本程序实例的task.close关闭旧的socket,否则程序会一直重连,导致所有socket相互冲突无法使用。

约定

1.只能通过前端主动关闭socket连接

如果需要断开socket,应该执行task.close()方法。如果后端想要关闭socket,应该下发一个消息,前端判断此消息,前端再调用task.close()方法关闭。因为无论是后端调用close还是因为其他原因造成的socket关闭,前端的socket都会触发onClose事件,程序无法判断是什么原因导致的关闭。因此本程序会默认尝试重连。

import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
  miniprogram: wx,
  connectSocketParams: {
    url: 'ws://xxxx'
  }
})
  .then(task => {
    task.onMessage = data => {
      if(data.data == 'close') task.close();//关闭socket并且,不再重连
    };
  })

2.后端对前端心跳的反馈

前端发送心跳消息,后端收到后,需要立刻返回响应消息,后端响应的消息可以是任何值,因为本程序并不处理和判断响应的心跳消息,而只是在收到任何消息后,重置心跳,因为收到任何消息就说明连接是正常的。因此本程序收到任何后端返回的消息都会重置心跳倒计时,以此来减少不必要的请求,减少服务器压力。

API

详情参考: https://github.com/zimv/websocket-heartbeat-miniprogram

结语

程序已经经过单元测试,也在百度,支付宝,微信等小程序之中实际测试和基于Taro测试。程序长期维护,发现兼容问题或者程序问题,希望得到issue反馈!

到此这篇关于小程序websocket心跳库(websocket-heartbeat-miniprogram)的文章就介绍到这了,更多相关小程序websocket心跳库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
基于jquery库的tab新形式使用
Nov 16 Javascript
jQuery中appendTo()方法用法实例
Jan 08 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
javascript实现点击后变换按钮显示文字的方法
May 13 Javascript
浅析node连接数据库(express+mysql)
Nov 30 Javascript
JS动态插入并立即执行回调函数的方法
Apr 21 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
详解React之key的使用和实践
Sep 29 Javascript
jQuery表单校验插件validator使用方法详解
Feb 18 jQuery
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
Jul 11 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 #Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 #Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 #Javascript
vue.js实现简单的计算器功能
Feb 22 #Javascript
Vue.js实现立体计算器
Feb 22 #Javascript
vue实现计算器功能
Feb 22 #Javascript
js实现网页版贪吃蛇游戏
Feb 22 #Javascript
You might like
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
python元组操作实例解析
2014/09/23 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python去除字符串中的换行符
2017/10/11 Python
python生成九宫格图片
2018/11/19 Python
python使用正则筛选信用卡
2019/01/27 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
基于python实现对文件进行切分行
2020/04/26 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
教师旷工检讨书
2014/01/18 职场文书
2014教师年度工作总结
2014/11/10 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
教师节感谢信
2015/01/22 职场文书
武侯祠导游词
2015/02/04 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
详解Python描述符的工作原理
2021/06/11 Python
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript