webSocket

1.创建 utils/webSocket.ts

复制代码
import { ctMsg } from "@/utils/custom/message"
import { getToken } from "./auth"

let socket = null // WebSocket 实例对象
let lockReconnect = false // 是否正在重连
const timeout = 20 * 1000 // 20秒一次心跳
let timeoutObj = null // 心跳定时器
let serverTimeoutObj = null // 服务超时定时器
let timeoutnum = null // 断开重连定时器

// 初始化 WebSocket 连接
const initWebSocket = async (data?:any) => {
    if ("WebSocket" in window) {
        const wsUrl = `ws://172.16.3.101:8081/api/galaxy?${data}`  // WebSocket 连接地址
        socket = new WebSocket(wsUrl)
        socket.onerror = webSocketOnError
        socket.onmessage = webSocketOnMessage
        socket.onclose = closeWebsocket
        socket.onopen = openWebsocket
    } else {
        ctMsg("浏览器不支持 WebSocket")
    }
}

// WebSocket 连接成功时的回调
const openWebsocket = (e) => {
    console.log("WebSocket 连接成功", e)
    start() // 启动心跳检测
}

// 启动心跳检测
const start = () => {
    // 清除上一次的定时器
    clearTimeout(timeoutObj)
    clearTimeout(serverTimeoutObj)

    // 发送心跳消息,保证连接活跃
    timeoutObj = setTimeout(() => {
        if (socket.readyState === WebSocket.OPEN) {
            socket.send("heartbeat") // 发送心跳消息
        } else {
            reconnect() // 如果连接不可用,则重连
        }

        // 超过指定时间(timeout)未收到响应,则认为连接失效,主动关闭
        serverTimeoutObj = setTimeout(() => {
            socket.close()
        }, timeout)
    }, timeout)
}

// 重新连接 WebSocket
const reconnect = () => {
    if (lockReconnect) return // 防止并发重连
    lockReconnect = true
    timeoutnum && clearTimeout(timeoutnum) // 清除已有的重连定时器
    timeoutnum = setTimeout(() => {
        initWebSocket() // 尝试重新连接
        lockReconnect = false
    }, 1000) // 延迟1秒后重连
}

// 重置心跳定时器
const reset = () => {
    clearTimeout(timeoutObj)
    clearTimeout(serverTimeoutObj)
    start() // 重新启动心跳检测
}

// 发送消息
const sendWebsocket = (message) => {
    if (socket && socket.readyState === WebSocket.OPEN) {
        console.log("发送消息:", message)
        socket.send(message)
    } else {
        console.error("WebSocket 连接未打开,无法发送消息")
    }
}

// WebSocket 错误处理
const webSocketOnError = (e) => {
    console.error("WebSocket 错误:", e)
    reconnect() // 出现错误时尝试重连
}

// 服务器返回消息的处理
const webSocketOnMessage = (e) => {
    try {
        const messageData = JSON.parse(e?.data) // 解析消息内容

        if (getToken()) { // 如果存在 Token,广播自定义事件
            window.dispatchEvent(
                new CustomEvent("onmessageWS", {
                    detail: { data: messageData }
                })
            )
        }
        reset() // 收到消息后重置心跳定时器
    } catch (error) {
        console.error("解析 WebSocket 消息失败:", error)
    }
}

// WebSocket 连接关闭时的处理
const closeWebsocket = (e) => {
    console.log("WebSocket 连接关闭:", e)
    reconnect() // 连接关闭后重连
}

// 手动关闭 WebSocket 连接
const close = () => {
    clearTimeout(timeoutObj)
    clearTimeout(serverTimeoutObj)
    if (socket) {
        socket.close() // 主动关闭连接
    }
}

export default { initWebSocket, sendWebsocket, webSocketOnMessage, close }

2.在页面中使用

引入

import websocket from "@/utils/websocket"

页面调用

onMounted(async () => {

websocket.initWebSocket("nanoid=111")

})

拿取数据

window.addEventListener(

"mousewheel",

function (event) {

if (event.ctrlKey === true || event.metaKey) {

event.preventDefault()

}

},

{

passive: false

}

)

离开销毁

onUnmounted(() => {

websocket.close()

})

相关推荐
2301_780789664 小时前
DDoS 攻击溯源:DNS 水印标记 + 区块链存证的双保险
运维·服务器·网络·云原生·ddos
全麦面包 time展天6 小时前
瀚海拾贝(一)HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
网络协议·http·asp.net
微硬创新6 小时前
耐达讯自动化16路0-20mA转PROFINET协议转换模块技术说明
人工智能·网络协议·自动化·信息与通信
2601_9494999410 小时前
芯瑞科技 DT-1414 光模块工程实测:完美兼容博通(安华高) HFBR-1414PTZ,VCSEL 替代方案
大数据·网络·人工智能·科技·光模块
2501_9159184110 小时前
iOS 怎么抓包?抓包鹰系统级 网卡 应用层三种方式对比,不越狱抓 iPhone 流量
网络协议·计算机网络·网络安全·ios·adb·https·udp
云边云科技_云网融合10 小时前
连锁门店 POS、监控、IoT 设备网络不稳定怎么解决?
网络·物联网
XR12345678812 小时前
学校宿舍区网络方案对比:多终端高并发下的认证、管理与体验
网络
March.s12 小时前
IP 存储核心 iSCSI:原理拆解 + 无报错实战指南
网络·网络协议·tcp/ip
星恒讯工业路由器12 小时前
远程访问技术解析:从内网穿透到安全隧道的三种主流方案
网络·信息与通信·内网穿透·远程访问·vpn隧道
超智算科技13 小时前
超智算领衔协办“NVIDIA创业企业展示·西安站”,全栈AI服务赋能行业生态协同发展
大数据·网络·人工智能·物联网·百度