直接使用gatewayworker。
在backend-init.js中:
斷線重連、心跳檢測
define(['backend'], function (Backend) {
var socket; //websocket的實例
var lockReconnect = false; //避免重複連接
reconnect();
function getwebsocket() { //新建websocket的函數 頁面初始化 斷開連接時重新調用
var wsUrl = 'ws://47.56.127.188:8384';
socket = new WebSocket(wsUrl);
socket.onerror = function(event) {
//console.log('websocket服務出錯了');
reconnect(wsUrl);
};
socket.onclose = function(event) {
//console.log('websocket服務關閉了');
reconnect(wsUrl);
};
socket.onopen = function(event) {
heartCheck.reset().start(); //傳遞信息
};
socket.onmessage = function(event) {
//如果獲取到消息,心跳檢測重置
//拿到任何消息都說明當前連接是正常的
//接受消息後的UI變化
var tmp = eval('(' + event.data + ')');
var type = tmp.type;
var action = tmp.action;
//最新通知推送(給所有在線用戶推送的)
if (type == 'notice' && action == 'withdraw') {
var alertSound = new Audio('/public/assets/audio/withdraw.mp3');
alertSound.play();
}
if (type == 'notice' && action == 'recharge') {
var alertSound = new Audio('/public/assets/audio/recharge.mp3');
alertSound.play();
}
heartCheck.reset().start();
};
}
function reconnect(url) {
if (lockReconnect) return;
lockReconnect = true;
//沒連接上會一直重連,設置延遲避免請求過多
setTimeout(function() {
getwebsocket();
lockReconnect = false;
}, 2000);
}
//心跳檢測
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拿到返回的心跳就說明連接正常
socket.send("心跳測試");
self.serverTimeoutObj = setTimeout(function() { //如果超過一定時間還沒重置,說明後端主動斷開了
socket.close(); //如果onclose會執行reconnect,我們執行ws.close()就行了.如果直接執行reconnect 會觸發onclose導致重連兩次
}, self.timeout);
}, this.timeout);
}
};
});