1、頁面加載時候,開啟長連接:
created() {
this.adminIds = getadminId();
this.tokens = getToken();
this.merIds = getmerId();
//頁面剛進入時,判斷有無token,有則開啟長連接
if(this.tokens) {
this.initWebSocket();
} else {}
},
2、頁面銷毀、關閉長連接:
destroyed: function() {
//頁面銷毀時關閉長連接
this.websocketclose();
},
3、定義長連接:
initWebSocket(){ //初始化weosocket
const that = this;
const wsuri = 'wss:// + 域名 + /merchantWebSocket?' + 'adminId=' + this.adminIds + '&token=' + this.tokens + '&userId=' + this.merIds; //ws地址,這個要跟后端協商定義
// console.log(wsuri);
//建立連接
this.websock = new WebSocket(wsuri);
//連接成功
this.websock.onopen = this.websocketonopen;
//連接錯誤
this.websock.onerror = this.websocketonerror;
//接收信息
this.websock.onmessage = this.websocketonmessage;
//連接關閉
this.websock.onclose = this.websocketclose;
},
4、斷線重連:
reconnect() {//重新連接
var that = this;
if(that.lockReconnect) {
return;
}
that.lockReconnect = true;
//沒連接上會一直重連,設置延遲避免請求過多
that.timeoutnum && clearTimeout(that.timeoutnum);
that.timeoutnum = setTimeout(function () {
//新連接
that.initWebSocket();
that.lockReconnect = false;
},5000);
},
5、其他連接方式:
websocketonopen() {//連接成功事件
console.log("WebSocket連接成功");
//開啟心跳
this.start();
},
websocketonerror(e) {//連接失敗事件
//錯誤
console.log("WebSocket連接發生錯誤");
//重連
this.reconnect();
},
websocketclose(e) {//連接關閉事件
//關閉
console.log("WebSocket關閉");
// console.log("connection closed (" + e.code + ")");
//重連
this.reconnect();
},
websockOpen() {//打開連接
console.log("WebSocket連接成功");
this.start();
},
websocketonmessage(e){ //數據接收
console.log(e.data);
//收到服務器信息,心跳重置
// this.reset();
},
6、開啟心跳:
start(){
// console.log('開啟心跳');
const self = this;
let _num = 3;
self.timeoutObj && clearTimeout(self.timeoutObj);
self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
self.timeoutObj = setTimeout(function(){
//這里發送一個心跳,后端收到后,返回一個心跳消息,
if (self.websock.readyState === 1) {//如果連接正常
// console.log(self.websock);
self.websock.send("heartCheck");
}else{//否則重連
self.reconnect();
}
self.serverTimeoutObj = setTimeout(function() {
//超時關閉
_num--;
//計算答復的超時次數
if(_num === 0) {
self.websocketclose();
}
}, self.timeout);
}, self.timeout)
},
7、重置心跳:
reset(){
// console.log('重置心跳');
var that = this;
//清除時間
clearTimeout(that.timeoutObj);
clearTimeout(that.serverTimeoutObj);
//重啟心跳
that.start();
},
8、export default ,data 中定義:
data() {
return {
levelList: null,
adminIds: '',
tokens: '',
merIds: '',
webSocket: null,
lockReconnect: false,//是否真正建立連接
timeout: 28*1000,//30秒一次心跳
timeoutObj: null,//心跳心跳倒計時
serverTimeoutObj: null,//心跳倒計時
timeoutnum: null,//斷開 重連倒計時
}
},
