忘了是哪里抄的,感謝那位仁兄。
代碼其他不需要改 ,,,只要改wsUrl變量,代碼邏輯在doWithMsg函數中,因為還有心跳檢測,會向后端發送心跳數據,需要返回數據,這個要后端配合下
<script> var ws;//websocket實例 var lockReconnect = false;//避免重復連接 var wsUrl = "xxx"; function createWebSocket(url) { try { if ('WebSocket' in window) { ws = new WebSocket(url); initEventHandle(); }else{ console.log('您的瀏覽器不支持websocket') } } catch (e) { reconnect(url); } } function initEventHandle() { ws.onclose = function (evnt) { //console.log('websocket服務關閉了'); reconnect(wsUrl); }; ws.onerror = function (evnt) { //console.log('websocket服務出錯了'); reconnect(wsUrl); }; ws.onopen = function (evnt) { //心跳檢測重置 heartCheck.reset().start(); }; ws.onmessage = function (evnt) { //如果獲取到消息,心跳檢測重置 //拿到任何消息都說明當前連接是正常的 //console.log('websocket服務獲得數據了'); //接受消息后的UI變化 doWithMsg(evnt.data); heartCheck.reset().start(); } //收到消息推送 function doWithMsg(msg) { // json數據轉換成js對象 var data = eval("(" + msg + ")"); var type = data.type || ''; switch (type) { // 返回的init類型的消息,將client_id發給后台進行uid綁定 case 'init': // 利用jquery發起ajax請求,將client_id發給后端進行uid綁定 // $.post('./bind.php', {client_id: data.client_id}, function(data){}, 'json'); break; case 'content': var value = array[Math.round(Math.random()*(array.length-1))]; // var data = JSON.parse(JSON.stringify(data.data)) break; default: console.log(data); } } } function reconnect(url) { if(lockReconnect) return; lockReconnect = true; //沒連接上會一直重連,設置延遲避免請求過多 setTimeout(function () { createWebSocket(url); lockReconnect = false; }, 5000); } //心跳檢測 var heartCheck = { timeout: 60000,//60秒 timeoutObj: null, serverTimeoutObj: null, reset: function(){ clearTimeout(this.timeoutObj); clearTimeout(this.serverTimeoutObj); return this; }, start: function(){ var self = this; this.timeoutObj = setTimeout(function(){ //這里發送一個心跳,后端收到后,返回一個心跳消息, //onmessage拿到返回的心跳就說明連接正常 ws.send("HeartBeat"); self.serverTimeoutObj = setTimeout(function(){//如果超過一定時間還沒重置,說明后端主動斷開了 ws.close();//如果onclose會執行reconnect,我們執行ws.close()就行了.如果直接執行reconnect 會觸發onclose導致重連兩次 }, self.timeout) }, this.timeout) } } //初始化websocket createWebSocket(wsUrl); </script>