亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1、斷開原因

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

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

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

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

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

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

CloseEvent.reason: reason是斷開原因,是字符串

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

狀態(tài)碼 名稱 描述
0–999   保留段, 未使用.
1000 CLOSE_NORMAL 正常關(guān)閉; 無論為何目的而創(chuàng)建, 該鏈接都已成功完成任務(wù).
1001 CLOSE_GOING_AWAY 終端離開, 可能因?yàn)榉?wù)端錯(cuò)誤, 也可能因?yàn)闉g覽器正從打開連接的頁面跳轉(zhuǎn)離開.
1002 CLOSE_PROTOCOL_ERROR 由于協(xié)議錯(cuò)誤而中斷連接.
1003 CLOSE_UNSUPPORTED 由于接收到不允許的數(shù)據(jù)類型而斷開連接 (如僅接收文本數(shù)據(jù)的終端接收到了二進(jìn)制數(shù)據(jù)).
1004   保留. 其意義可能會(huì)在未來定義.
1005 CLOSE_NO_STATUS 保留. 表示沒有收到預(yù)期的狀態(tài)碼.
1006 CLOSE_ABNORMAL 保留. 用于期望收到狀態(tài)碼時(shí)連接非正常關(guān)閉 (也就是說, 沒有發(fā)送關(guān)閉幀).
1007 Unsupported Data 由于收到了格式不符的數(shù)據(jù)而斷開連接 (如文本消息中包含了非 UTF-8 數(shù)據(jù)).
1008 Policy Violation 由于收到不符合約定的數(shù)據(jù)而斷開連接. 這是一個(gè)通用狀態(tài)碼, 用于不適合使用 1003 和 1009 狀態(tài)碼的場(chǎng)景.
1009 CLOSE_TOO_LARGE 由于收到過大的數(shù)據(jù)幀而斷開連接.
1010 Missing Extension 客戶端期望服務(wù)器商定一個(gè)或多個(gè)拓展, 但服務(wù)器沒有處理, 因此客戶端斷開連接.
1011 Internal Error 客戶端由于遇到?jīng)]有預(yù)料的情況阻止其完成請(qǐng)求, 因此服務(wù)端斷開連接.
1012 Service Restart 服務(wù)器由于重啟而斷開連接.
1013 Try Again Later 服務(wù)器由于臨時(shí)原因斷開連接, 如服務(wù)器過載因此斷開一部分客戶端連接.
1014   由 WebSocket標(biāo)準(zhǔn)保留以便未來使用.
1015 TLS Handshake 保留. 表示連接由于無法完成 TLS 握手而關(guān)閉 (例如無法驗(yàn)證服務(wù)器證書).
1016–1999   由 WebSocket標(biāo)準(zhǔn)保留以便未來使用.
2000–2999   由 WebSocket拓展保留使用.
3000–3999   可以由庫或框架使用.? 不應(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();      //拿到任何消息都說明當(dāng)前連接是正常的
        console.log("llws收到消息啦:" +event.data);
        if(event.data!='pong'){
            let data = jsON.parse(event.data);
        }
    };
}
// 監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。
window.onbeforeunload = function() {
    ws.close();
}  

function reconnect(url) {
    if(lockReconnect) return;
    lockReconnect = true;
    setTimeout(function () {     //沒連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過多
        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拿到返回的心跳就說明連接正常
            ws.send("ping");
            console.log("ping!")
            self.serverTimeoutObj = setTimeout(function(){//如果超過一定時(shí)間還沒重置,說明后端主動(dòng)斷開了
                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)斷開連接,搜了很多博客都說設(shè)置一下nginx的proxy_read_timeout,但是這個(gè)時(shí)間過長會(huì)影響服務(wù)器性能,采取心跳包的方式每隔1分鐘客戶端自動(dòng)發(fā)送ping消息給服務(wù)端,服務(wù)端需要返回pong。即可解決問題。

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

相關(guān)文章

  • javascript事件委托的方式綁定詳解

    javascript事件委托的方式綁定詳解

    我們?cè)趯W(xué)習(xí)JavaScript中,難免都會(huì)去網(wǎng)上查一些資料,也許偶爾就會(huì)遇到“事件委托”,但是,大多數(shù)時(shí)說的是“事件綁定”,對(duì)于“事件委托”,或是不提,或是淺嘗輒止,對(duì)于我這個(gè)比較好奇的人來說,實(shí)在很頭疼,尤其是想更多的了解“事件委托”的時(shí)候
    2015-06-06
  • 微信小程序自定義組件封裝及父子間組件傳值的方法

    微信小程序自定義組件封裝及父子間組件傳值的方法

    這篇文章主要介紹了微信小程序自定義組件封裝及父子間組件傳值的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 經(jīng)常用到的javascript驗(yàn)證函數(shù)收集

    經(jīng)常用到的javascript驗(yàn)證函數(shù)收集

    經(jīng)常用到的javascript驗(yàn)證函數(shù)收集...
    2007-11-11
  • 如何在JavaScript中運(yùn)行.NET?Core代碼詳情

    如何在JavaScript中運(yùn)行.NET?Core代碼詳情

    這篇文章主要介紹了在JavaScript中運(yùn)行.NET?Core代碼詳情,DotNetJS可以將C#項(xiàng)目編譯為與任何環(huán)境兼容的單文件JavaScript庫,變可以在JavaScript中運(yùn)行.NET?Core代碼,相關(guān)操作分享詳情,需要的小伙伴可以參考一下
    2022-04-04
  • JS forEach和map方法的用法與區(qū)別分析

    JS forEach和map方法的用法與區(qū)別分析

    這篇文章主要介紹了JS forEach和map方法的用法與區(qū)別,結(jié)合實(shí)例形式分析了forEach和map方法的功能、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • AutoJs4.4.1免費(fèi)版快速接通vscode調(diào)試腳本的操作方法

    AutoJs4.4.1免費(fèi)版快速接通vscode調(diào)試腳本的操作方法

    這篇文章主要介紹了AutoJs4.4.1免費(fèi)版快速接通vscode進(jìn)行調(diào)試腳本,首先下載AutoJs并安裝,下載完成后,將2個(gè)apk文件拷貝到手機(jī)安裝即可,接下來需要安裝插件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • js前端存儲(chǔ)之sessionStorage使用方法舉例

    js前端存儲(chǔ)之sessionStorage使用方法舉例

    sessionStorage是指本地存儲(chǔ)一個(gè)會(huì)話中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁面才能訪問并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀,這篇文章主要給大家介紹了關(guān)于js前端存儲(chǔ)之sessionStorage使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • JS實(shí)現(xiàn)當(dāng)前頁居中分頁效果的方法

    JS實(shí)現(xiàn)當(dāng)前頁居中分頁效果的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)當(dāng)前頁居中分頁效果的方法,涉及javascript操作頁面元素與樣式的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • js表單序列化判斷空值的實(shí)例

    js表單序列化判斷空值的實(shí)例

    下面小編就為大家?guī)硪黄猨s表單序列化判斷空值的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 利用H5api實(shí)現(xiàn)時(shí)鐘的繪制(javascript)

    利用H5api實(shí)現(xiàn)時(shí)鐘的繪制(javascript)

    這篇文章主要為大家詳細(xì)介紹了利用H5api實(shí)現(xiàn)時(shí)鐘的繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09

最新評(píng)論