首页 > 其他分享 >webScoket重连机制,心跳机制

webScoket重连机制,心跳机制

时间:2023-09-12 10:58:41浏览次数:39  
标签:WebSocket value event ws 心跳 机制 重连 webScoket 连接

webScoket可以实时获取数据,做到实时渲染的效果,但ws一直连接着还好,万一网络波动,断了呢。。。。

那只能刷新页面,重新连接,但又不晓得啥时候断了,这时候就要用到心跳机制,对ws进行监视

// WebSocket连接地址
const wsUrl = ref('')
// Ws实例
const ws = ref()
onMounted( () => {
    getId()     // 获取用户id,利用id进行ws链接,否则会出现多用户打开断的情况。需要后端处理,
})
const getId = () => {
  wsUrl.value = `${import.meta.env.VITE_WS}/processLog/socket/${userInfo.value.id}` // 这里在env.pro和env.dev里设置下VITE_WS变量(不要带引号),最后面是拿用户的id
    ws_create(wsUrl.value)
}
// 创建WebSocket
function ws_create(url: string) {
  try {
    // 判断是否支持 WebSocket
    if ('WebSocket' in window) {
      // 连接WebSocket
      ws.value = new WebSocket(url)
      // 初始化WebSocket事件(WebSocket对象, WebSocket连接地址)
      ws_event(ws.value, url)
    }
  } catch (e) {
    // 重新连接WebSocket
    ws_recontent(url)
    console.log('重新连接')
  }
}
// WebSocket 事件创建
function ws_event(ws: any, url: string) {
  ws.onopen = function (event: any) {
    // 心跳检测重置
    ws_heartCheck.reset().start()
    console.log('WebSocket已连接')
  }

  ws.onclose = function (event: any) {
    // 重新连接WebSocket
    ws_recontent(url)
    console.log('WebSocket连接已关闭')
  }

  ws.onerror = function (event: any) {
    // 重新连接WebSocket
    ws_recontent(url)
    console.log('WebSocket错误:', event)
  }

  ws.onmessage = function (event: any) {
    // 只要有数据,那就说明连接正常
    ws_heartCheck.reset().start()
    // 处理数据,只处理非心跳检测的数据
    const result = JSON.parse(event.data)
    console.log(result, 'result')
   // 处理数据逻辑
  }
}
// 重新连接websocker(WebSocket连接地址)
function ws_recontent(url) {
  // 延迟避免请求过多
  setTimeout(() => {
    ws_create(wsUrl.value)
  }, 3000)
}
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。
window.onbeforeunload = function () {
  ws.value.close()
}

// 核心逻辑  根据后端在规定时间内返回的心跳数据进行判断。比如后端5s返回一次心跳数据,定时器就设在5s左右,如果有数据返回,就直接进到ws.onMessage里了,如果没有,超过了定时器的时间,就会close这次链接,然后在规定的几秒后进行重新连接,也就是ws_recontent方法,时间就是3s

// 10秒一次心跳
const timeOut = ref(10000)
// 执行心跳的定时器
const timeoutObj = ref()
// 服务器超时定时器
const serverTimeoutObj = ref()
// WebSocket心跳检测
var ws_heartCheck = {
  reset() {
    // 重置方法
    clearTimeout(timeoutObj.value)
    clearTimeout(serverTimeoutObj.value)
    return this
  },
  start() {
    // 启动方法
    timeoutObj.value = setTimeout(() => {
      // 这里发送一个心跳信息,后端收到后,返回一个消息,在onmessage拿到返回的心跳(信息)就说明连接正常
      // ws.value.send('check')
      // 如果超过一定时间还没重置,说明后端主动断开了
      serverTimeoutObj.value = setTimeout(() => {
        // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        ws.value.close()
      }, timeOut.value)
    }, timeOut.value)
  },
}

 

标签:WebSocket,value,event,ws,心跳,机制,重连,webScoket,连接
From: https://www.cnblogs.com/alannero/p/17695551.html

相关文章

  • javascript事件循环机制及面试题详解
    javascript事件循环机制及面试题详解 javascript是单线程执行的程序,也就是它只有一条主线,所有的程序都是逐行“排队”执行,在这种情况下可能存在一些问题,比如说setTimeout、ajax等待执行的时间较长,就会阻塞后续代码的执行,使得整个程序执行的耗时非常久,那么为了应对这样一个问......
  • 基于大数据的校园精准精扶贫机制的分析与实现-计算机毕业设计源码+LW文档
    一、研究的背景意义所谓大数据技术,主要指能够进行传统常规软件无法处理的海量数据的数据统计、处理、挖掘和分析等相关技术。大数据技术的重点不是获取和存储海量的数据信息,而是对这些海量数据信息进行专业化处理。大数据技术离不开云计算,云计算为大数据技术的应用提供了基本的设......
  • select 机制
    select机制9/100发布文章wuyiyu_未选择文件APP访问硬件的4种方式:查询,休眠-唤醒,poll方式,异步通知。这篇文章会详细为大家讲解select机制的使用。@TOC一、POLL/SELECT方式的功能:SELECT机制、POLL机制是完全一样的,只是APP接口函数不一样。在调用poll,select函数时......
  • java异常处理的三种机制
    一、try-catch-finally语句(推荐)try{//可能出现异常的代码}catch(Exceptione){//处理异常的代码}finally{//无论是否出现异常都会执行的代码}try-catch-finally语句是Java中最基本也是最常用的异常处理方法。它包含三个部分:try、catch和fin......
  • TTL机制实现延迟消息
              ......
  • Linux多线程同步机制(下)
    @TOC前言一、读写锁多线程同步机制中的读写锁(Read-WriteLock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。读写锁的基本原则是:多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当有线程持有写锁时,其他线......
  • 七、Nginx缓存机制
    对于性能优化而言,缓存是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等,Nginx的缓存则属于代理缓存的一种。对于整个系统而言,加入缓存带来的优势额外明显:减少了再次向后端或文件服务器请求资源的带宽消耗。降低了下游服务器的......
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!
    0前言注册中心不应仅提供服务注册和发现功能,还应保证对服务可用性监测,对不健康的服务和过期的进行标识或剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。因此本文介绍Nacos注册中心的健康检查机制。1注册中心的健康检查机制知道⼀个服务是否还健康的方式:客户......
  • JavaSE--反射机制
    一、反射机制  java.lang.reflect.*;1、反射机制的作用  通过java语言中的反射机制可以操作字节码文件,可以读和修改字节码文件。  通过反射机制可以操作代码片段(class文件)2、反射机制相关的类  java.lang.Class:代表整个字节码,代表一个类型,代表整个类  java.lang.......
  • Python中的异常处理机制
    finally语句是Python中异常处理机制的一部分,它总是会被执行,无论是否发生异常。finally语句通常用于释放资源或执行清理操作。下面是一个简单的例子:try:#代码段1passexceptExceptionType:#代码段2passelse:#代码段3passfinally:#代码段4......