前端websocket

const WebSocketUtil: any = (function () {
    let url: string
    let sessionId: any
    let Socket: WebSocket | null = null
    let isReconnecting = true
    let interval: any = null

    function createWebSocket(socketUrl: string, token) {
        console.error("调用了createWebSocket")
        isReconnecting = true
        url = socketUrl
        sessionId = token
        try {
            Socket && Socket.close()
            if (!Socket) {
                Socket = new WebSocket(`${url + token}`)
                Socket.onopen = onopen
                Socket.onmessage = onmessage
                Socket.onerror = onerror
                Socket.onclose = onclose
            }
        } catch (error) {
            console.error(error)
        }
    }

    function onopen() {
        sendPing({ heart: `${sessionId}` })
    }

    function onmessage(event: any) {
        window.dispatchEvent(new CustomEvent("onmessage", {
            detail: {
                data: event.data
            }
        }))
    }

    function onerror() {
        console.error("websocket连接出错")
        Socket?.close()
        clearInterval(interval)
        if (Socket?.readyState !== Socket?.CLOSED) {
            Socket = null
            createWebSocket(url, sessionId)
        }
    }

    function onclose() {
        console.error("websocket已关闭")
        clearInterval(interval)
        if (isReconnecting) {
            if (Socket?.readyState !== Socket?.CLOSING) {
                Socket = null
                createWebSocket(url, sessionId)
            }
        }
    }

    function connect(message: any) {
        setTimeout(() => {
            if (Socket?.readyState == Socket?.CONNECTING) {
                connect(message)
            } else {
                Socket?.send(JSON.stringify(message))
            }
        }, 1000)
    }

    function sendPing(message: any) {
        clearInterval(interval)
        Socket?.send(JSON.stringify(message))
        interval = setInterval(() => {
            Socket?.send(JSON.stringify(message))
        }, 5000)
    }

    function closeSocket() {
        clearInterval(interval)
        isReconnecting = false
        Socket?.close()
        Socket = null
    }

    return {
        closeSocket,
        onclose,
        createWebSocket,
    }
})()

export default WebSocketUtil
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值