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 }
(3)測試截圖
3.心得
所謂的心跳檢測,就是隔一段時間向服務器進行一次數據訪問,因為長時間不使用會導致ws自動斷開,
一般是間隔90秒內無操作會自動斷開,因此,在間隔時間內進行一次數據訪問,以防止ws斷開即可,
這里選擇30秒,倒計時30秒內無操作則進行一次訪問,有操作則重置計時器