webSocket 前端 js 加入 心跳機制 的基本寫法


1前言

websocket 一般 每隔 90 秒無操作則會自動斷開  ,需要加入一個心跳機制 來防止 自斷

 

2. 實驗過程

(1)設定一個jsp 或html 文件都行 ,加入元素

 

(2)js 源碼 ,點擊查看

  1 //避免重復鏈接
  2 var lockReconnect = false;
  3 //路徑
  4 var wsUrl = $("#wsUrl").val();
  5 console.log("路徑" + wsUrl);
  6 //webSocket對象
  7 var ws;
  8 //時間間隔
  9 var tt;
 10 
 11 if ("WebSocket" in window) {
 12     console.log("支持WebSocket")
 13 } else {
 14     alert("該瀏覽器不支持WebSocket")
 15 }
 16 
 17 //創建ws連接
 18 var createWebSocket = function (wsUrl) {
 19     try {
 20         //成功
 21         ws = new WebSocket(wsUrl);
 22         webSocketInit();//初始化webSocket連接函數
 23     } catch (e) {
 24         //失敗
 25         console.log('catch');
 26         //重連
 27         //重連函數
 28         webSocketReconnect(wsUrl);
 29     }
 30 };
 31 //初始化方法,成功后執行
 32 var webSocketInit = function () {
 33     //連接關閉函數
 34     ws.onclose = function () {
 35         console.log("連接已關閉...");
 36         webSocketReconnect(wsUrl)//如果連接關閉則重連
 37     };
 38     //連接錯誤函數
 39     ws.onerror = function () {
 40         console.log("連接錯誤...");
 41         webSocketReconnect(wsUrl)//如果連接錯誤則重連
 42     };
 43     //連接建立,發送信息
 44     ws.onopen = function () {
 45         var message1 = {
 46             "type": "SUB",
 47             "service": "業務1-確認第一次發送信息"
 48         };
 49         ws.send(JSON.stringify(message1));//webSocket業務訂閱——可以有多個業務
 50         // var message2 = {
 51         //     "type": "SUB",
 52         //     "service": "業務2"
 53         // };
 54         // ws.send(JSON.stringify(message2));
 55         //心跳檢測啟動
 56         heartCheck.start();//訂閱業務發送之后啟動心跳檢測機制
 57     };
 58     //業務訂閱成功后接受服務端推送消息  ,其實是個字符串
 59     ws.onmessage = function (evt) {
 60         console.log('接收到消息' + evt.data);
 61         $("#span").html(evt.data);
 62         // var DATA=JSON.parse(evt.data);
 63         // if (DATA.service=="業務1") {
 64         //     console.log("接收業務1的數據");
 65         //     //接收業務1的數據,並進行相關邏輯處理
 66         // }
 67         // if (DATA.service=="業務2"){
 68         //     console.log("接收業務1的數據");
 69         //     //接收業務2的數據,並進行相關邏輯處理
 70         // }
 71         //接收一次后台推送的消息,即進行一次心跳檢測重置
 72 
 73         heartCheck.reset();
 74     };
 75 
 76 };
 77 
 78 
 79 var webSocketReconnect = function (url) {
 80     console.log("socket 連接斷開,正在嘗試重新建立連接");
 81     if (lockReconnect) {
 82         return;
 83     }
 84     lockReconnect = true;
 85     //沒連接上會一直重連,設置延遲,避免請求過多
 86 
 87     //
 88     //s中清楚setTimeout的定時觸發設置,之所以加個timer,是為了方便第二次賦值給timer。
 89     // 也就是說直接clearTImeout(timer)則timer就不存在了 再次訪問就是error了。
 90     // 而timer&&clearTimeout(timer)則將timer 變成undefined
 91     tt && clearTimeout(tt);
 92     tt = setTimeout(function () {
 93        createWebSocket(url);
 94     }, 4000)
 95 };
 96 
 97 
 98 //心跳檢測  .所謂的心跳檢測,就是隔一段時間向服務器僅限一次數據訪問,因為長時間不使用會導致ws自動斷開,
 99 // 一般是間隔90秒內無操作會自動斷開,因此,在間隔時間內進行一次數據訪問,以防止ws斷開即可,
100 //這里選擇30秒,倒計時30秒內無操作則進行一次訪問,有操作則重置計時器
101 //
102 //封裝為鍵值對的形式,成為js對象,與json很相似
103 var heartCheck={
104     timeout: 30000,//30秒
105     timeoutObj: null,
106     reset: function(){//接收成功一次推送,就將心跳檢測的倒計時重置為30秒
107         clearTimeout(this.timeoutObj);//重置倒計時
108         this.start();
109     },
110     start: function(){//啟動心跳檢測機制,設置倒計時30秒一次
111         this.timeoutObj = setTimeout(function(){
112             var message = {
113                 "type": "t10010",
114                 "service":"運行心跳業務一次 =="+ new Date()
115             };
116             // JSON.stringify()的作用是將 JavaScript 對象轉換為 JSON 字符串
117             //而JSON.parse()可以將JSON字符串轉為一個對象。
118             console.log("心跳一次");
119             ws.send(JSON.stringify(message));//啟動心跳
120         },this.timeout)
121     }
122     //onopen連接上,就開始start及時,如果在定時時間范圍內,onmessage獲取到了服務端消息,
123     // 就重置reset倒計時,距離上次從后端獲取消息30秒后,執行心跳檢測,看是不是斷了。
124 };
125 
126 //開始創建webSocket連接
127 createWebSocket(wsUrl);
128 ///
129 function mysend() {
130     var text = $("#text").val();
131     console.log("text:" + text);
132     //向ws發送信息
133     ws.send(text);
134 
135 }
View Code

 

 (3)測試截圖

 

 

 

 

3.心得

所謂的心跳檢測,就是隔一段時間向服務器進行一次數據訪問,因為長時間不使用會導致ws自動斷開,
一般是間隔90秒內無操作會自動斷開,因此,在間隔時間內進行一次數據訪問,以防止ws斷開即可,
這里選擇30秒,倒計時30秒內無操作則進行一次訪問,有操作則重置計時器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM