vue3 websocket实现心跳

42 篇文章 0 订阅
11 篇文章 0 订阅

实现场景

  该需求是运用websocket进行网页之间通讯,同时保证websocket在通讯期间保持激活的状态。

功能分析

   1、在websocket报错时,重新苏醒。

   2、在websocket自动关闭时,重新连接。

   3、在通讯期间,整个websocket能接受消息,并通过不同的消息,进行加载不同的数据和交互

   4、websocket实例化时,主动加入房间。

代码实施


const initWebSocket = () => {
  try {
    if ('WebSocket' in window) {
      ws.value = new WebSocket(serveUrl + '/ws')
      heartForm.value.time = 1
      modelData.value.lockReconnect = true
      modelData.value.isAlive = false
      //建立连接时,钩子函数,当连接状态正常时,会执行钩子函数
      ws.value.onopen = onOpen
//绑定 收到websocket返回的消息钩子函数
      ws.value.onmessage = onMessage
//报错后,重新连接
      ws.value.onerror = function (e) {
        initWebSocket()
      }
//关闭后,直接重新连接
      ws.value.onclose = function (e) {
        initWebSocket()
      }
    } else {
      alert('当前浏览器 Not support websocket')
    }
  } catch (e) {
    reconnect()
  }
}

const reconnect = () => {
  if (modelData.value.lockReconnect) return;
  modelData.value.lockReconnect = true;
  setTimeout(function () { //没连接上会一直重连,设置延迟避免请求过多
    initWebSocket()
    modelData.value.lockReconnect = false;
  }, 2000);
}
//打开状态
const onOpen = (e) => {
  
  }
}
//接受信息
const onMessage = (e) => {
  

}

  

遇到的问题

        1、websocket每次实例化时,都要将onerror,onmessage,onclose,onopen 重新实例化。

        2、onmessage获取到的是所有的数据,需要对传送过来的信息进行过滤

        3、websockt在使用一段时间后,长时间未使用,有可能断开连接,需要重新连接。

总结分享

        1、这里后端未做心跳检测,就直接前端以定时器轮询的方式,不断进行连接,知道websocket重新连接上位置;

        2、主要的接受到消息的逻辑都是在onmessage里面,里面的逻辑比较复杂,需要根据实际的场景进行设定。

        3、onopen在在正式连接成功之后,会执行的方法。需要加入房间的操作,可以放入这里面。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中实现WebSocket心跳的方法有多种。下面是一种可行的方法: 1. 首先,你需要使用Vue 3提供的`@vue/composition-api`插件来使用Composition API特性。你可以通过安装该插件来引入它。 2. 在你的Vue组件中,使用`ref`函数创建一个响应式的变量来保存WebSocket对象。例如,你可以使用以下代码创建一个WebSocket对象的变量: ```javascript import { ref, onMounted } from '@vue/composition-api'; export default { setup() { const webSocket = ref(null); onMounted(() => { webSocket.value = new WebSocket('ws://your-websocket-url'); // 在这里你可以监听WebSocket的事件并添加适当的处理逻辑 }); return { webSocket }; } } ``` 3. 接下来,你可以在组件的`setup`函数中使用`watch`函数来监听WebSocket的状态,并实现心跳功能。以下是一个简单的示例: ```javascript import { ref, onMounted, watch } from '@vue/composition-api'; export default { setup() { const webSocket = ref(null); onMounted(() => { webSocket.value = new WebSocket('ws://your-websocket-url'); // 在这里你可以监听WebSocket的事件并添加适当的处理逻辑 }); watch(webSocket, (newWebSocket, oldWebSocket) => { if (newWebSocket && newWebSocket.readyState === WebSocket.OPEN) { // 当WebSocket连接打开时,发送心跳消息 setInterval(() => { newWebSocket.send('PING'); }, 5000); // 5秒发送一次心跳消息 } if (oldWebSocket && oldWebSocket.readyState === WebSocket.OPEN) { // 当WebSocket连接关闭时,停止发送心跳消息 clearInterval(); } }); return { webSocket }; } } ``` 这样,你就可以在Vue 3中通过WebSocket实现心跳功能了。在上面的代码中,我们使用了Composition API的`ref`函数来创建一个响应式的变量来保存WebSocket对象,并使用`onMounted`钩子函数在组件挂载后创建WebSocket连接。然后,我们使用`watch`函数来监听WebSocket对象的变化,并根据WebSocket的状态来发送和停止心跳消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值