js?websocket斷線重連實(shí)例代碼
js websocket斷開重連實(shí)例代碼
請(qǐng)根據(jù)自己需求做出相應(yīng)改動(dòng)Vue中使用websocket
$(function() { var lockReconnect = false;//避免重復(fù)連接 var ws = null; //WebSocket的引用 var wsUrl = "xxxxxx"; //這個(gè)要與后端提供的相同 //創(chuàng)建WebSocket連接,如果不確定瀏覽器是否支持,可以使用socket.js做連接 function createWebSocket(url){ try { if ('WebSocket' in window) { ws = new WebSocket("ws://" + url + "/socketServer"); } else { ws = new SockJS("http://" + url + "/sockjs/socketServer"); } initEventHandle(); } catch (e) { reconnect(wsUrl); } } function reconnect(url) { if(lockReconnect) return; lockReconnect = true; //沒(méi)連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過(guò)多 setTimeout(function () { createWebSocket(wsUrl); console.log("正在重連,當(dāng)前時(shí)間"+new Date()) lockReconnect = false; }, 5000); //這里設(shè)置重連間隔(ms) } /*********************初始化開始**********************/ function initEventHandle() { // 連接成功建立后響應(yīng) ws.onopen = function() { console.log("成功連接到" + wsUrl); //心跳檢測(cè)重置 heartCheck.reset().start(); } // 收到服務(wù)器消息后響應(yīng) ws.onmessage = function(e) { //如果獲取到消息,心跳檢測(cè)重置 //拿到任何消息都說(shuō)明當(dāng)前連接是正常的 heartCheck.reset().start(); //Json轉(zhuǎn)換成Object var msg = eval('(' + e.data + ')'); if(msg.message == "heartBeat"){ //忽略心跳的信息,因?yàn)橹灰邢⑦M(jìn)來(lái),斷線重連就會(huì)重置不會(huì)觸發(fā) }else{ //處理消息的業(yè)務(wù)邏輯 } } // 連接關(guān)閉后響應(yīng) ws.onclose = function() { console.log("關(guān)閉連接"); reconnect(wsUrl);//重連 } ws.onerror = function () { reconnect(wsUrl);//重連 }; } /***************初始化結(jié)束***********************/ //心跳檢測(cè) var heartCheck = { timeout: 15000,//毫秒 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("HeartBeat"); console.log("HeartBeat"); self.serverTimeoutObj = setTimeout(function(){//如果超過(guò)一定時(shí)間還沒(méi)重置,說(shuō)明后端主動(dòng)斷開了 ws.close();//如果onclose會(huì)執(zhí)行reconnect,我們執(zhí)行ws.close()就行了.如果直接執(zhí)行reconnect 會(huì)觸發(fā)onclose導(dǎo)致重連兩次 }, self.timeout) }, this.timeout) } } // 發(fā)送字符串消息 $("#sendBtn").click(function() { if (ws.readyState ==1) { //自定義消息串,讓后端接收 ws.send("xxxxxx"); }else{ alert("當(dāng)前連接超時(shí),請(qǐng)刷新重試!"); } return false; }); // 強(qiáng)制退出 window.onunload = function() { ws.close(); } createWebSocket(wsUrl);/**啟動(dòng)連接**/ });
引用
初探和實(shí)現(xiàn)websocket心跳重連(npm: websocket-heartbeat-js)
以上就是js websocket斷線重連實(shí)例代碼的詳細(xì)內(nèi)容,更多關(guān)于js websocket斷線重連的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 action-sheet 反饋上拉菜單簡(jiǎn)單實(shí)例
這篇文章主要介紹了微信小程序 action-sheet 反饋上拉菜單簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05JS實(shí)現(xiàn)刷新網(wǎng)頁(yè)后之前瀏覽位置保持不變示例詳解
這篇文章主要為大家介紹了JS實(shí)現(xiàn)刷新網(wǎng)頁(yè)后之前瀏覽位置保持不變示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08微信小程序 POST請(qǐng)求(網(wǎng)絡(luò)請(qǐng)求)詳解及實(shí)例代碼
這篇文章主要介紹了微信小程序 POST請(qǐng)求(網(wǎng)絡(luò)請(qǐng)求)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11微信小程序 wx.request(接口調(diào)用方式)詳解及實(shí)例
這篇文章主要介紹了微信小程序 wx.request(接口調(diào)用方式)詳解及實(shí)例的相關(guān)資料,wx.request請(qǐng)求方式比較簡(jiǎn)單,但是在使用的時(shí)候出現(xiàn)錯(cuò),這里就記錄下,需要的朋友可以參考下2016-11-11