前言

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

  • 博客:https://www.cnblogs.com/1wen/p/5808276.html
  • 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等。无论如何,业务是需要一层心跳机制的,否则一些情况下会丢失连接导致功能无法使用。

用法

安装

1npm 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反馈!

https://wx.tenpay.com/f2f?t=AQAAAB783RadsEXy2nz36GYeyf0%3D (二维码自动识别)

有没有人打赏?没有的话,那我晚点再来问问。

http://weixin.qq.com/r/IExmfi3E1XCqrWkd9xky (二维码自动识别)

关注大诗人公众号,第一时间获取最新文章。

htmlcss实例小项目_小程序websocket心跳库——websocket-heartbeat-miniprogram相关推荐

  1. python练习小项目_小商店购物结算

    '''编号 购买个数 名称 价格 ''' dict1 = {"1": [0,'自行车',2000],"2": [0,'小汽车',200000],"3& ...

  2. Java web小项目_个人主页(1)—— 云环境搭建与项目部署

    摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...

  3. java小项目家庭记账程序

    文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...

  4. Java web小项目_个人主页(2)—— 边缘加速原理与实现

    摘自:Java web小项目_个人主页(2)-- 边缘加速原理与实现 作者:丶PURSUING 发布时间: 2021-03-27 14:44:40 网址:https://blog.csdn.net/w ...

  5. c小项目,小码资金管理工具

    纯c小项目,小码资金管理工具moneykeeper 作者:流浪舟 公众号:小码之光 你小码哥回来啦!最近闷得慌,又在学java(自学,想走这条路,哎,一个人找到所爱的真的很难,说不定哪天真的挂了,就来 ...

  6. python秒表小项目_适合新手练习的几个python小项目

    关于python练习的小项目,其实就是一些常用的模块的针对练习 一.找出电脑中遗忘的大文件 # !/usr/bin/env python # _*_ coding:utf-8 -*- import o ...

  7. 开源一个安信可A9g小项目微信小程序定位器项目②GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 如何在windows10上环境搭建,编译烧录代码固件,查看运行 ...

  8. 基于stm32的简单小项目_适合小白做的创业3个小项目,简单上手

    现在每一位为了能够让自己和家人过上更好地生活,都会不满足于现状的单方面地工作,想要通过创业来改变如今的局面,这种想法也是好的,但是我们需要知道想要创业,并不是那么的容易,需要有一定的技能和管理水平才能 ...

  9. python小项目-python 小项目

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 事先录制好一段音频,客户接通电话后,自动播放https:blog.csd ...

最新文章

  1. Google Test(GTest)使用方法和源码解析——死亡测试技术分析和应用
  2. 各种Web漏洞测试平台
  3. SparkSubmit源码解读记录
  4. user parameter to determine cache in SAP Gateway
  5. ABAP document read logic
  6. interrupt、interrupted 、isInterrupted 区别
  7. ulead gif animator_搞笑GIF趣图:这风看来很大啊,今天回不来家了7
  8. iOS开发:remove reference与move to trash的区别
  9. java linux 信号_Java 中关于信号的处理在Linux下的实现
  10. linux下 添加一个新账户tom,linux 账户管理命令 useradd、groupadd使用方法
  11. 流行的Spring Boot + Vue架构整合开发的网易云,附源码!
  12. Windows系统-删除指定服务!
  13. PeopleSoft 快捷键
  14. 【无标题】ensp华为基础配置命令
  15. 8.抓取西刺网站(代理ip网站)
  16. python中字符串的基本操作_python字符串的基本操作
  17. 相对于java,C++中的那些神奇语法
  18. Android考勤毕业论文,基于android的考勤系统的设计与实现.doc
  19. 年薪20万招java讲师
  20. IOS学习博客-坚持就是胜利

热门文章

  1. shell替换程序里的代码
  2. android按钮固定尺寸,如何在android中保持按钮的固定宽高比
  3. python连接sql数据库_python连接sql server数据库实现增删改查
  4. python核心,内建函数,高阶函数
  5. Django之创建应用以及配置路由
  6. python静态方法,类方法,属性方法,实例方法
  7. win7 64位出现桌面右键鼠标显示忙碌
  8. 计算机无线局域网毕业论文,谈教学设计《计算机网络》网络课程“无线局域网”单元的设计与开发大专毕业论文范文...
  9. MYSQL存储磁盘创建vgcreate_【转】parted创建硬盘分区并创建LVM
  10. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)