当前位置: 首页 > news >正文

uni-app 封装websocket 心跳检测,开箱即用

class websocketUtils {constructor(url, needbeat, options = {}) {this.needbeat = needbeat;this.url = url;this.options = options;this.ws = null;this.heartbeatInterval = options.heartbeatInterval || 10000; // 心跳间隔,默认为10秒  this.reconnectInterval = options.reconnectInterval || 5000; // 重连间隔,默认为5秒  this.reconnectAttempts = options.reconnectAttempts || Infinity; // 最大重连次数,默认为无限次  this.reconnectCount = 0;this.initWebSocket();}initWebSocket() {this.ws = uni.connectSocket({url: this.url,success: () => {console.log('WebSocket连接成功');if (this.needbeat) {this.startHeartbeat();}this.onOpen();},fail: (err) => {console.error('WebSocket连接失败', err);this.reconnect();}});// 监听WebSocket接收到服务器的消息事件  this.ws.onMessage((result) => {// const textDecoder = new TextDecoder();// let text = textDecoder.decode(result.data)// console.log('自定义处理消息:',result);this.onMessage(result);// 收到消息后,可能需要重置心跳计时器  // 是否需要心跳选择器if (this.needbeat) {this.resetHeartbeat();}})// 监听WebSocket关闭事件  this.ws.onClose(res => {console.log('WebSocket连接已关闭', res);this.onClose();this.reconnect();});// 监听WebSocket错误事件  this.ws.onError(err => {console.error('WebSocket发生错误', err);this.onError(err);this.reconnect();});}// 发送消息  send(data) {if (this.ws) {this.ws.send({data: data,success: () => {console.log('消息发送成功');},fail: (err) => {console.error('消息发送失败', err);}})}}// 心跳检测  startHeartbeat() {this.heartbeatTimer = setInterval(() => {this.sendHeartbeat();}, this.heartbeatInterval);}// 重置心跳计时器  resetHeartbeat() {clearInterval(this.heartbeatTimer);this.startHeartbeat();}// 发送心跳消息  sendHeartbeat() {this.send('ping'); // 假设心跳消息为'ping'  }// 重连逻辑  reconnect() {if (this.reconnectCount < this.reconnectAttempts) {setTimeout(() => {this.initWebSocket();this.reconnectCount++;}, this.reconnectInterval);}}// 自定义事件处理  onOpen() {}onMessage(data) {}onClose() {}onError(err) {}// 关闭WebSocket连接  close() {if (this.ws) {this.ws.close({success: () => {console.log('WebSocket连接已关闭');},fail: (err) => {console.error("wss关闭失败->", err)}});clearInterval(this.heartbeatTimer);this.ws = null;}}
}
export default websocketUtils;

使用

let socket = new websocketUtils(wss_.url, false, {heartbeatInterval: 5000,reconnectInterval: 3000,reconnectAttempts: 5
});socket.onMessage = function(evt) {//获取消息
};socket.send(message);//发送消息
socket.close();//关闭sockett

相关文章:

  • 原码反码补码移码
  • 快速创建第一个Spring Boot 项目
  • 【Python】Flask-Admin:构建强大、灵活的后台管理界面
  • 避免glibc版本而报错,CentOS等Linux安装node.js完美方法
  • 展锐平台的手机camera 系统isptool 架构
  • 外贸电商系统卷轴模式开发:技术深度解析与实践
  • QEMU使用Qemu-Guest-Agent传输文件、执行指令等
  • 企业安全策略制定
  • 零知识证明当中Witness、Commitment 和 Proof 之间的关系
  • 可商业化的数字孪生系统
  • LeetCode 2266. 统计打字方案数
  • Apache Iceberg 数据类型参考表
  • 拉格朗日插值讲解与MATLAB例程
  • STM32——串口通信(发送/接收数据与中断函数应用)
  • 优化Mysql
  • 78. Subsets
  • angular2开源库收集
  • ECS应用管理最佳实践
  • emacs初体验
  • If…else
  • JAVA多线程机制解析-volatilesynchronized
  • Java面向对象及其三大特征
  • Java应用性能调优
  • k8s 面向应用开发者的基础命令
  • Linux各目录及每个目录的详细介绍
  • 分享几个不错的工具
  • 诡异!React stopPropagation失灵
  • 嵌入式文件系统
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何设计一个微型分布式架构?
  • 如何在GitHub上创建个人博客
  • 什么是Javascript函数节流?
  • 用mpvue开发微信小程序
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • hi-nginx-1.3.4编译安装
  • Linux权限管理(week1_day5)--技术流ken
  • 阿里云服务器购买完整流程
  • #{} 和 ${}区别
  • (11)MSP430F5529 定时器B
  • (4)logging(日志模块)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • .cn根服务器被攻击之后
  • .NET Core 版本不支持的问题
  • .net framework4与其client profile版本的区别
  • .NET 的程序集加载上下文
  • .NET 中 GetProcess 相关方法的性能
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NetCore发布到IIS
  • //TODO 注释的作用
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @GetMapping和@RequestMapping的区别