Uniapp:WebSocket 重连之后累加触发 uni.onSocketOpen()

省流

  • 不要用 uni.xxx 那一套,用 socketTask = await uni.connectSocket({}) socketTask 去控制

业务逻辑描述

  1. 第一次进入应用主页,连接 WebSocket
  2. 手机熄屏之后,断开当前连接的 WebSocket
  3. 手机亮屏之后,再次进入应用后,重新连接 WebSocket 服务

问题

  • 亮屏之后,再次进入应用,WebSocket 会累加,导致我发送的心跳包:

  • 第一次熄屏亮起,会在短时间内发送两次

  • 第二次熄屏亮起,会在短时间内发送三次

  • ...累加

问题截图

问题代码

大概就是这套逻辑

用的都是 uni.xxx 这套,问题就出现在这里了

javascript 复制代码
import { handleSocketMessage } from './websocketUtils'
import Nav2Login from '@/utils/request/modelNavigateToLogin'
let socketOpen = false
let socketMsgQueue: any = []
let heartbeatTimer: any | null = null

async function startWebsocketServer() {
  if (heartbeatTimer) {
    clearInterval(heartbeatTimer)
    heartbeatTimer = null
  }
  if (socketOpen) {
    await closeWebSocket()
  }
  await uni
    .connectSocket({
      url: WS_URL,
    })
    .then((res) => {
     
    })

  /**
   * 问题:
   * https://ask.dcloud.net.cn/question/149762
   */
  uni.onSocketOpen(function (res: any) {
    socketOpen = true
    for (var i = 0; i < socketMsgQueue.length; i++) {
      sendSocketMessage(socketMsgQueue[i])
    }
    socketMsgQueue = []
  })

  /**
   * 这里会有熄屏累积次数的效果
   */
  uni.onSocketMessage(function (res) {
    console.log('收到服务器内容:' + res.data)
    handleSocketMessage(res.data)
  })
}

function sendSocketMessage(msg: any) {
  if (socketOpen) {
    uni.sendSocketMessage({
      data: msg,
    })
  } else {
    socketMsgQueue.push(msg)
  }
}

/**
 * 关闭WebSocket连接
 */
export function closeWebSocket() {
  return new Promise((resolve, reject) => {
    uni.closeSocket({
      success: function (res) {
        console.log('WebSocket关闭成功!:>>', res)
        socketOpen = false
        clearInterval(heartbeatTimer)
        heartbeatTimer = null
        console.log('清除心跳定时器')
        resolve('Close Socket Success')
      },
      fail: function (res) {
        console.log('WebSocket关闭失败!:>>', res)
        reject('Close Socket Reject')
      },
      complete: () => {
        // console.log('complete')
      },
    })
  })
}
export default startWebsocketServer

解决之后的截图

解决的代码框架,参考官方文档

typescript 复制代码
let socketTask: any = null
//  complete: (res) => {}, 一定要有
socketTask = await uni.connectSocket({
  url: WS_URL,
  complete: (res) => {},
})
socketTask.onOpen(() => {})
socketTask.onMessage((res: any) => {})
socketTask.close({
  success: (res: any) => {},
  fail: (res: any) => {},
})
相关推荐
冰暮流星17 小时前
flask之http请求方法
网络·网络协议·http
K成长日志17 小时前
BLE协议之设备地址
网络·物联网·网络协议·嵌入式·蓝牙·ble
liulilittle18 小时前
KCC 边界缺陷深度分析:六问题根源与解决方案
网络·网络协议·tcp/ip·计算机网络·信息与通信·ip·通信
千逐6818 小时前
Uniapp 鸿蒙实战之 AtomGit APP - 仓库详情与文件树浏览
服务器·microsoft·uni-app
万物得其道者成19 小时前
uni-app App 热更新实现指南:从接口检查到下载安装重启(附带AI提示词)
uni-app
anyup20 小时前
uView Pro 正式支持 MCP 协议!让 AI 秒懂你的组件库
前端·uni-app·ai编程
犹豫的哑铃21 小时前
WebSocket 协议
网络·websocket·网络协议
funnycoffee12321 小时前
lacp报文占多少字节?报文的目的mac
网络·网络协议·macos
lihao lihao1 天前
Tcp Socket
网络·网络协议·tcp/ip
从零开始的代码生活_1 天前
Linux select 多路转接详解
linux·运维·服务器·网络·网络协议·tcp/ip·计算机网络