websocket实现自动链接、心跳

本文详细介绍了如何通过WebSocket实现自动连接、心跳检测以及错误处理,包括配置参数、初始化方法、事件监听和重连策略等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参数说明

/**
 * @module initWebSocket 初始化
 * @module websocketonopen 连接成功
 * @module websocketonerror 连接失败
 * @module websocketclose 断开连接
 * @module resetHeart 重置心跳
 * @module sendSocketHeart 心跳发送
 * @module reconnect 重连
 * @module sendMsg 发送数据
 * @module websocketonmessage 接收数据
 * @module test 测试收到消息传递
 * @description socket 通信
 * @param {string} url socket地址
 * @param {WebSocket} websocket websocket 实例
 * @param {NodeJS.Timer} heartTime 心跳定时器实例
 * @param {number} socketHeart 心跳次数
 * @param {number} HeartTimeOut 心跳超时时间
 * @param {number} socketError 错误次数
 */

配置全局参数

下面展示一些 设局参数配置

let socketUrl = '' // socket地址
let websocket: WebSocket // websocket 实例
let heartTime: NodeJS.Timer // 心跳定时器实例
let socketHeart = 0 // 心跳次数
const HeartTimeOut = 10000 // 心跳超时时间 10000 = 10s
let socketError = 0 // 错误次数

初始化webSocket

function initWebSocket(url: string) {
  socketUrl = url
  // 初始化 websocket
  websocket = new WebSocket(`${url}?Authorization=token&clientid=clientid`)
  websocketonopen()
  websocketonmessage()
  websocketonerror()
  websocketclose()
  sendSocketHeart()
  return websocket
}

对应方法

// socket 连接成功
export function websocketonopen() {
  websocket.onopen = function () {
    console.log('连接 websocket 成功')
    resetHeart()
  }
}

// socket 连接失败
export function websocketonerror() {
  websocket.onerror = function (e: Event) {
    console.error('连接 websocket 失败', e)
  }
}

// socket 断开链接
export function websocketclose() {
  websocket.onclose = function (e: Event) {
    console.log('断开连接', e)
  }
}

// socket 重置心跳
export function resetHeart() {
  socketHeart = 0
  socketError = 0
  clearInterval(heartTime)
  sendSocketHeart()
}

// socket心跳发送
export function sendSocketHeart() {
  heartTime = setInterval(() => {
    // 如果连接正常则发送心跳
    if (websocket.readyState === 1) {
      // if (socketHeart <= 30) {
      websocket.send(
        JSON.stringify({
          type: 'ping',
        }),
      )
      socketHeart = socketHeart + 1
    }
    else {
      // 重连
      reconnect()
    }
  }, HeartTimeOut)
}

// socket重连
export function reconnect() {
  if (socketError <= 2) {
    clearInterval(heartTime)
    initWebSocket(socketUrl)
    socketError = socketError + 1
    console.log('socket重连', socketError)
  }
  else {
    console.log('重试次数已用完')
    clearInterval(heartTime)
  }
}

// socket 发送数据
export function sendMsg(data: string) {
  websocket.send(data)
}

// socket 接收数据
export function websocketonmessage(callback?: (e: MessageEvent) => void) {
  websocket.onmessage = function (e: MessageEvent) {
    const data = e.data
    if (data.includes('heartbeat')) {
      resetHeart()
      return
    }
    if (data.includes('ping')) {
      return
    }
    callback?.(e)
    const msg = data ? JSON.parse(data).msgContent : ''
    ElNotification({
      title: '消息',
      message: msg,
      type: 'success',
      dangerouslyUseHTMLString: true,
      duration: 3000,
    })

    return msg
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值