vue3实现websocket连接

2025.03.23今天我学习了用vue3实现websocket长连接,代码如下:

<template>
  <div>
    <h1>WebSocket Example</h1>
    <p>Current Message: {{ message }}</p>
  </div>
</template>

<script>
import { ref, onMounted, onBeforeUnmount } from "vue";

export default {
  setup() {
    const message = ref(""); // 用于展示从 WebSocket 获取的消息
    let ws = null; // WebSocket 实例
    let reconnectTimeout = null; // 重连超时控制
    const heartbeatInterval = 30000; // 设置心跳包发送时间间隔(30秒)

    // 建立 WebSocket 连接
    const connectWebSocket = () => {
      ws = new WebSocket("wss://example.com/socket"); // 替换为实际的 WebSocket 服务 URL

      ws.onopen = () => {
        console.log("WebSocket 连接已建立");
      };

      ws.onmessage = (event) => {
        message.value = event.data; // 接收到服务器推送的消息
      };

      ws.onerror = (error) => {
        console.error("WebSocket 发生错误", error);
      };

      ws.onclose = (event) => {
        console.log("WebSocket 连接已关闭", event.code);
        handleReconnect(); // WebSocket 连接关闭时尝试重连
      };
    };

    // 处理 WebSocket 连接断开后的重连
    const handleReconnect = () => {
      // 如果已经在重连,避免重复重连
      if (reconnectTimeout) {
        return;
      }

      reconnectTimeout = setTimeout(() => {
        console.log("正在尝试重新连接 WebSocket...");
        connectWebSocket();
        reconnectTimeout = null; // 重连后清除重连超时
      }, 5000); // 5 秒后重连
    };

    // 发送心跳包
    const sendHeartbeat = () => {
      if (ws && ws.readyState === WebSocket.OPEN) {
        console.log("发送心跳包");
        ws.send(JSON.stringify({ type: "heartbeat" })); // 自定义心跳包的格式
      }
    };

    // 检查 WebSocket 连接状态
    const checkConnectionStatus = () => {
      if (ws.readyState === WebSocket.OPEN) {
        console.log("WebSocket 连接正常");
      } else if (ws.readyState === WebSocket.CONNECTING) {
        console.log("WebSocket 正在连接...");
      } else if (ws.readyState === WebSocket.CLOSING) {
        console.log("WebSocket 连接正在关闭...");
      } else if (ws.readyState === WebSocket.CLOSED) {
        console.log("WebSocket 连接已关闭,准备重连");
        handleReconnect();
      }
    };

    onMounted(() => {
      connectWebSocket(); // 组件加载时连接 WebSocket

      // 每隔 30 秒发送一次心跳包
      setInterval(sendHeartbeat, heartbeatInterval);

      // 每隔 5 秒检查一次 WebSocket 状态
      setInterval(checkConnectionStatus, 5000);
    });

    onBeforeUnmount(() => {
      if (ws) {
        ws.close(); // 组件销毁时关闭 WebSocket 连接
      }
    });

    return {
      message,
    };
  },
};
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小奶龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值