最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JS WebSocket斷開(kāi)原因和心跳機(jī)制

 更新時(shí)間:2021年05月07日 15:46:24   作者:淺笑·  
這篇文章主要介紹了JS WebSocket斷開(kāi)原因和心跳機(jī)制,對(duì)websocket感興趣的同學(xué),可以參考下

1、斷開(kāi)原因

WebSocket斷開(kāi)的原因有很多,最好在WebSocket斷開(kāi)時(shí),將錯(cuò)誤打印出來(lái)。

ws.onclose = function (e) {
  console.log('websocket 斷開(kāi): ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
  console.log(e)
}

錯(cuò)誤狀態(tài)碼:

WebSocket斷開(kāi)時(shí),會(huì)觸發(fā)CloseEvent, CloseEvent會(huì)在連接關(guān)閉時(shí)發(fā)送給使用 WebSockets 的客戶端. 它在 WebSocket 對(duì)象的 onclose 事件監(jiān)聽(tīng)器中使用。CloseEvent的code字段表示了WebSocket斷開(kāi)的原因??梢詮脑撟侄沃蟹治鰯嚅_(kāi)的原因。

CloseEvent有三個(gè)字段需要注意, 通過(guò)分析這三個(gè)字段,一般就可以找到斷開(kāi)原因

CloseEvent.code: code是錯(cuò)誤碼,是整數(shù)類(lèi)型

CloseEvent.reason: reason是斷開(kāi)原因,是字符串

CloseEvent.wasClean: wasClean表示是否正常斷開(kāi),是布爾值。一般異常斷開(kāi)時(shí),該值為false

狀態(tài)碼 名稱(chēng) 描述
0–999   保留段, 未使用.
1000 CLOSE_NORMAL 正常關(guān)閉; 無(wú)論為何目的而創(chuàng)建, 該鏈接都已成功完成任務(wù).
1001 CLOSE_GOING_AWAY 終端離開(kāi), 可能因?yàn)榉?wù)端錯(cuò)誤, 也可能因?yàn)闉g覽器正從打開(kāi)連接的頁(yè)面跳轉(zhuǎn)離開(kāi).
1002 CLOSE_PROTOCOL_ERROR 由于協(xié)議錯(cuò)誤而中斷連接.
1003 CLOSE_UNSUPPORTED 由于接收到不允許的數(shù)據(jù)類(lèi)型而斷開(kāi)連接 (如僅接收文本數(shù)據(jù)的終端接收到了二進(jìn)制數(shù)據(jù)).
1004   保留. 其意義可能會(huì)在未來(lái)定義.
1005 CLOSE_NO_STATUS 保留. 表示沒(méi)有收到預(yù)期的狀態(tài)碼.
1006 CLOSE_ABNORMAL 保留. 用于期望收到狀態(tài)碼時(shí)連接非正常關(guān)閉 (也就是說(shuō), 沒(méi)有發(fā)送關(guān)閉幀).
1007 Unsupported Data 由于收到了格式不符的數(shù)據(jù)而斷開(kāi)連接 (如文本消息中包含了非 UTF-8 數(shù)據(jù)).
1008 Policy Violation 由于收到不符合約定的數(shù)據(jù)而斷開(kāi)連接. 這是一個(gè)通用狀態(tài)碼, 用于不適合使用 1003 和 1009 狀態(tài)碼的場(chǎng)景.
1009 CLOSE_TOO_LARGE 由于收到過(guò)大的數(shù)據(jù)幀而斷開(kāi)連接.
1010 Missing Extension 客戶端期望服務(wù)器商定一個(gè)或多個(gè)拓展, 但服務(wù)器沒(méi)有處理, 因此客戶端斷開(kāi)連接.
1011 Internal Error 客戶端由于遇到?jīng)]有預(yù)料的情況阻止其完成請(qǐng)求, 因此服務(wù)端斷開(kāi)連接.
1012 Service Restart 服務(wù)器由于重啟而斷開(kāi)連接.
1013 Try Again Later 服務(wù)器由于臨時(shí)原因斷開(kāi)連接, 如服務(wù)器過(guò)載因此斷開(kāi)一部分客戶端連接.
1014   由 WebSocket標(biāo)準(zhǔn)保留以便未來(lái)使用.
1015 TLS Handshake 保留. 表示連接由于無(wú)法完成 TLS 握手而關(guān)閉 (例如無(wú)法驗(yàn)證服務(wù)器證書(shū)).
1016–1999   由 WebSocket標(biāo)準(zhǔn)保留以便未來(lái)使用.
2000–2999   由 WebSocket拓展保留使用.
3000–3999   可以由庫(kù)或框架使用.? 不應(yīng)由應(yīng)用使用. 可以在 IANA 注冊(cè), 先到先得.
4000–4999   可以由應(yīng)用使用.

2、加入心跳

var lockReconnect = false;  //避免ws重復(fù)連接
var ws = null;          // 判斷當(dāng)前瀏覽器是否支持WebSocket
var wsUrl = serverConfig.socketUrl;
createWebSocket(wsUrl);   //連接ws

function createWebSocket(url) {
    try{
        if('WebSocket' in window){
            ws = new WebSocket(url);
        }
        initEventHandle();
    }catch(e){
        reconnect(url);
        console.log(e);
    }     
}

function initEventHandle() {
    ws.onclose = function () {
        reconnect(wsUrl);
        console.log("llws連接關(guān)閉!"+new Date().toLocaleString());
    };
    ws.onerror = function () {
        reconnect(wsUrl);
        console.log("llws連接錯(cuò)誤!");
    };
    ws.onopen = function () {
        heartCheck.reset().start();      //心跳檢測(cè)重置
        console.log("llws連接成功!"+new Date().toLocaleString());
    };
    ws.onmessage = function (event) {    //如果獲取到消息,心跳檢測(cè)重置
        heartCheck.reset().start();      //拿到任何消息都說(shuō)明當(dāng)前連接是正常的
        console.log("llws收到消息啦:" +event.data);
        if(event.data!='pong'){
            let data = jsON.parse(event.data);
        }
    };
}
// 監(jiān)聽(tīng)窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒(méi)斷開(kāi)就關(guān)閉窗口,server端會(huì)拋異常。
window.onbeforeunload = function() {
    ws.close();
}  

function reconnect(url) {
    if(lockReconnect) return;
    lockReconnect = true;
    setTimeout(function () {     //沒(méi)連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過(guò)多
        createWebSocket(url);
        lockReconnect = false;
    }, 2000);
}

//心跳檢測(cè)
var heartCheck = {
    timeout: 1000,        //1分鐘發(fā)一次心跳
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
    },
    start: function(){
        var self = this;
        this.timeoutObj = setTimeout(function(){
            //這里發(fā)送一個(gè)心跳,后端收到后,返回一個(gè)心跳消息,
            //onmessage拿到返回的心跳就說(shuō)明連接正常
            ws.send("ping");
            console.log("ping!")
            self.serverTimeoutObj = setTimeout(function(){//如果超過(guò)一定時(shí)間還沒(méi)重置,說(shuō)明后端主動(dòng)斷開(kāi)了
                ws.close();     //如果onclose會(huì)執(zhí)行reconnect,我們執(zhí)行ws.close()就行了.如果直接執(zhí)行reconnect 會(huì)觸發(fā)onclose導(dǎo)致重連兩次
            }, self.timeout)
        }, this.timeout)
    }
}
    // 收到客戶端消息后調(diào)用的方法 
    @OnMessage  
    public void onMessage(String message, Session session) {  
        if(message.equals("ping")){
        }else{
        。。。。
        }
   }

系統(tǒng)發(fā)現(xiàn)websocket每隔1分鐘自動(dòng)斷開(kāi)連接,搜了很多博客都說(shuō)設(shè)置一下nginx的proxy_read_timeout,但是這個(gè)時(shí)間過(guò)長(zhǎng)會(huì)影響服務(wù)器性能,采取心跳包的方式每隔1分鐘客戶端自動(dòng)發(fā)送ping消息給服務(wù)端,服務(wù)端需要返回pong。即可解決問(wèn)題。

以上就是詳解JS WebSocket斷開(kāi)原因和心跳機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JS WebSocket斷開(kāi)原因和心跳機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS實(shí)現(xiàn)HTML標(biāo)簽轉(zhuǎn)義及反轉(zhuǎn)義

    JS實(shí)現(xiàn)HTML標(biāo)簽轉(zhuǎn)義及反轉(zhuǎn)義

    本文主要介紹了JS實(shí)現(xiàn)HTML標(biāo)簽轉(zhuǎn)義及反轉(zhuǎn)義的方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • js實(shí)現(xiàn)touch移動(dòng)觸屏滑動(dòng)事件

    js實(shí)現(xiàn)touch移動(dòng)觸屏滑動(dòng)事件

    在開(kāi)始描述touch事件之前,需要先描述一下多觸式系統(tǒng)中特有的touch對(duì)象(android和iOS乃至nokia最新的meego系統(tǒng)都模擬了類(lèi) 似的對(duì)象)。這個(gè)對(duì)象封裝一次屏幕觸摸,一般來(lái)自于手指。它在touch事件觸發(fā)的時(shí)候產(chǎn)生,可以 通過(guò)touch event handler的event對(duì)象取到
    2015-04-04
  • 詳解微信小程序文件下載--視頻和圖片

    詳解微信小程序文件下載--視頻和圖片

    這篇文章主要介紹了微信小程序文件下載視頻和圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaScript實(shí)現(xiàn)Fly Bird小游戲

    JavaScript實(shí)現(xiàn)Fly Bird小游戲

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)Fly Bird小游戲的制作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • javascript中Date()函數(shù)在各瀏覽器中的顯示效果

    javascript中Date()函數(shù)在各瀏覽器中的顯示效果

    本文給大家分享的是javascript中Date()函數(shù)在各瀏覽器中的顯示效果,由于各大瀏覽器的兼容性問(wèn)題,本文做了這個(gè)測(cè)試,希望有需要的小伙伴可以少走些彎路
    2015-06-06
  • JavaScript交換兩個(gè)變量值的七種解決方案

    JavaScript交換兩個(gè)變量值的七種解決方案

    最近在寫(xiě)位操作的時(shí)候突然想到了這個(gè)問(wèn)題,突然想總結(jié)一下,交換變量值的問(wèn)題可能使我們學(xué)習(xí)編程語(yǔ)言接觸到的比較早的邏輯問(wèn)題,小伙伴或多或少會(huì)兩種解決的方法,本文提供了七種解決的方法,下面跟著小編來(lái)一起看看吧。
    2016-12-12
  • 微信小程序開(kāi)發(fā)之全局配置與頁(yè)面配置實(shí)現(xiàn)

    微信小程序開(kāi)發(fā)之全局配置與頁(yè)面配置實(shí)現(xiàn)

    本文主要介紹了微信小程序開(kāi)發(fā)之全局配置與頁(yè)面配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • JavaScript實(shí)現(xiàn)美化滑塊效果

    JavaScript實(shí)現(xiàn)美化滑塊效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)美化滑塊效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • js 頁(yè)面關(guān)閉前的出現(xiàn)提示的實(shí)現(xiàn)代碼

    js 頁(yè)面關(guān)閉前的出現(xiàn)提示的實(shí)現(xiàn)代碼

    主流的瀏覽器都支持onbeforeunload事件(即頁(yè)面卸載前觸發(fā)的事件),而現(xiàn)在大多網(wǎng)站都用到了此功能
    2011-05-05
  • 談?wù)凧avaScript自定義回調(diào)函數(shù)

    談?wù)凧avaScript自定義回調(diào)函數(shù)

    使用Jquery的時(shí)候發(fā)現(xiàn)它里面的很多方法都提供回調(diào)函數(shù),接下來(lái)通過(guò)本篇文章給大家介紹js自定義回調(diào)函數(shù),需要的朋友參考下
    2015-10-10

最新評(píng)論

临泽县| 陆良县| 蓬莱市| 冷水江市| 尖扎县| 武强县| 于田县| 青州市| 江华| 玛多县| 河南省| 新安县| 峡江县| 宜兰县| 广丰县| 达日县| 土默特左旗| 永兴县| 临城县| 将乐县| 龙陵县| 南充市| 平果县| 晋州市| 翁牛特旗| 仲巴县| 舟曲县| 平度市| 黄山市| 沙坪坝区| 武汉市| 勐海县| 万载县| 浮山县| 黔南| 安阳县| 元氏县| 开阳县| 咸丰县| 滦平县| 沙田区|