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

【vue3+Typescript】unapp+stompsj模式下替代plus-websocket的封装模块

由于plus-websocket实测存在消息丢失的问题,只能寻找替代的方案,看文章说使用原生的即可很好的工作。而目前在stompjs里需要使用websocket类型的封装模块,看了下原来提供的接口,采用uniapp原生的websocket模式,对原模块进行了重新封装,最终单元模块如下:

ccWebsocket.ts:

import { IStompSocket } from '@stomp/stompjs'

let socket: UniApp.SocketTask

/**
 * uniapp WebSocket Polyfill
 * @Jim 2024/11/23
 */
class WebSocketPolyfill implements IStompSocket {
  constructor(url) {
    // 创建连接
    this.url = url

    if (socket) {
      socket.onClose = () => {} // 清理侦听
      socket.close({}) // 正常关闭
    }

    socket = uni.connectSocket({
      url,
      success: (res) => {
        console.log('连接创建成功:', res)
      },
      fail: (err) => {
        console.error('连接创建失败:', err)
      }
    })

    socket.onOpen((res) => {
      console.log('连接已开启', res)
      this.onopen(res)
    })

    socket.onClose((res) => {
      console.log('连接已关闭', res)
      this.onclose(res)
    })

    socket.onError((res) => {
      console.log('连接错误', res)
      this.onclose(res) // 出错断开重连,因为uniapp原生onclose监听不到
    })

    socket.onMessage((res) => {
      this.onmessage(res)
    })
  }

  url: string
  get readyState(): number {
    return (socket as any).readyState
  }

  /**
   * 连接开启回调,会被StompHandler接管
   */
  onopen(res) {}

  /**
   * 连接关闭回调,会被StompHandler接管
   */
  onclose(res) {}

  /**
   * 连接异常回调,会被StompHandler接管
   */
  onerror(res) {}

  /**
   * 接收消息回调,会被StompHandler接管
   */
  onmessage(res) {}

  /**
   * 发送消息
   */
  send(data) {
    if (socket) {
      socket.send({
        data,
        success: () => {
          // console.log('消息发送成功:', data)
        },
        fail: (err) => {
          console.error('消息发送失败:', err)
        }
      })
    }
  }

  /**
   * 关闭连接
   */
  close() {
    if (socket) {
      socket.close({
        success: () => {
          console.log('连接关闭成功')
        },
        fail: (err) => {
          console.error('连接关闭失败:', err)
        }
      })
    }
  }

  /**
   * 检查是否已连接
   */
  connected() {
    const nativeSocket = socket as any
    // console.log('检查连接状态:', nativeSocket.readyState)
    return socket && nativeSocket.readyState === 1
  }
}

export default WebSocketPolyfill

实测在IOS和Android下能很好工作,不会丢失消息了,能自动重连。另外心跳也能正常工作了不用另建立一个线程处理


http://www.kler.cn/a/408133.html

相关文章:

  • std::unique_ptr源码中构造函数的偏特化。_Unique_ptr_enable_default_t
  • 11 —— 打包模式的应用
  • postgresql按照年月日统计历史数据
  • 拥塞控制算法的 Utility-Function
  • 传奇996_32——npc及怪物顶戴花翎
  • 探索 RocketMQ:企业级消息中间件的选择与应用
  • 百度Q3财报:净利润增长17%超预期 文心大模型日调用量增30倍达15亿
  • 通过轻易云平台实现聚水潭数据高效集成到MySQL的技术方案
  • stable diffusion生成模型
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
  • C0031.在Clion中使用mingw编译器来编译opencv的配置方法
  • 02. Python基础知识
  • js版本之ES5特性简述【String、Function、JSON、其他】(二)
  • MySQL系列之身份鉴别(安全)
  • Unet++改进35:添加FastKANConv2DLayer(2024最新改进方法)
  • 本地项目提交到gitee
  • 如何高效集成YS网店客户和组织映射数据到MongoDB
  • PHP导出EXCEL含合计行,设置单元格格式
  • Kafka 数据倾斜:原因、影响与解决方案
  • STM32-- 调试 -日志输出
  • vue3的宏到底是什么东西?
  • C++ 中数组作为参数传递时,在函数中使用sizeof 为什么无法得到数组的长度
  • 【MATLAB源码-第222期】基于matlab的改进蚁群算法三维栅格地图路径规划,加入精英蚁群策略。包括起点终点,障碍物,着火点,楼梯。
  • Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
  • VSCode 使用技巧
  • Java开发经验——并发工具类库线程安全问题