WebSocket如何斷開重連

微信圖片_20210907104149.jpg
    var lockReconnect = false;//避免重復(fù)連接
    var wsUrl = "ws://localhost:8080/websocket/111";        // websocket鏈接
    var ws;
    if ("WebSocket" in window) {
        function createWebSocket(){
            try {
                ws = new WebSocket(wsUrl);
                websocketInit();
            } catch (e) {
                console.log('catch');
                websocketReconnect(wsUrl);
            }
        }

        createWebSocket();          // 創(chuàng)建websocket

        function websocketInit () {
            // 建立 web socket 連接成功觸發(fā)事件
            ws.onopen = function (evt) {
                onOpen(evt);
            };
            // 斷開 web socket 連接成功觸發(fā)事件
            ws.onclose = function (evt) {
                websocketReconnect(wsUrl);
                onClose(evt);
            };
            // 接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)事件
            ws.onmessage = function (evt) {
                onMessage(evt);
            };
            // 通信發(fā)生錯(cuò)誤時(shí)觸發(fā)
            ws.onerror = function (evt) {
                websocketReconnect(wsUrl);
                onError(evt);
            };
        };

        function onOpen(evt) {
            console.log("建立連接");
            //心跳檢測(cè)重置
            heartCheck.start();
        }

        function onClose(evt) {
            console.log("連接已關(guān)閉...");
        }

       function onMessage(evt) {
            console.log('接收消息: ' + evt.data);
            var data = JSON.parse(evt.data);
            console.log(data);
            console.log(data.heart);
            if (data.hasOwnProperty("heart")) {// 存在key為heart
                    if (data.heart=="live"){// 心跳正常 再次執(zhí)行
                        heartCheck.start();
                        console.log('心跳正常 再次執(zhí)行心跳檢測(cè)方法!');
                    }
                    return;
            }
        }

        function onError(evt) {
            console.log('通信錯(cuò)誤:' + evt.data);
        }


        function websocketReconnect(url) {
            if (lockReconnect) {       // 是否已經(jīng)執(zhí)行重連
                return;
            };
            lockReconnect = true;
            //沒連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過多
            tt && clearTimeout(tt);
            var tt = setTimeout(function () {
                createWebSocket(url);
                lockReconnect = false;
            }, 5000);
        }

        //心跳檢測(cè)
        var heartCheck = {
            timeout: 30000,
            timeoutObj: null,
            serverTimeoutObj: null,
            start: function () {
                console.log('執(zhí)行心跳檢測(cè)');
                var self = this;
                this.timeoutObj && clearTimeout(this.timeoutObj);
                this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
                this.timeoutObj = setTimeout(function () {
                    //發(fā)送測(cè)試信息,后端收到后,返回一個(gè)消息,
                    ws.send("heart");
                    self.serverTimeoutObj = setTimeout(function () {
                        ws.close();
                    }, self.timeout);
                }, this.timeout)
            }
        }


    }else{
        alert("您的瀏覽器不支持websocket 請(qǐng)更換瀏覽器后重試!");
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容