import { collectService } from '@/services';
export default {
prop: ['formWhere'],
data() {
return {
dialogPop: false,
isDisabled: true,
webInfo: [],
id: null,
ws: null,//建立的连接
lockReconnect: false,//是否真正建立连接
timeout: 58*1000,//58秒一次心跳
timeoutObj: null,//心跳心跳倒计时
serverTimeoutObj: null,//心跳倒计时
timeoutnum: null,//断开 重连倒计时
}
},
created() {
this.initWebpack();
},
methods: {
initWebpack(){
const wsurl='wss://XXXXXXX';//ws地址,这里加入自己的地址即可
this.ws = new WebSocket(wsurl);
this.ws.onopen = this.onopen;
this.ws.onmessage = this.onmessage;
this.ws.onclose = this.onclose;
this.ws.onerror = this.onerror;
},
reconnect() {//重新连接
var that = this;
if(that.lockReconnect) {
return;
};
that.lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
that.timeoutnum && clearTimeout(that.timeoutnum);
that.timeoutnum = setTimeout(function () {
//新连接
that.initWebpack();
that.lockReconnect = false;
},5000);
},
reset(){//重置心跳
var that = this;
//清除时间
clearTimeout(that.timeoutObj);
clearTimeout(that.serverTimeoutObj);
//重启心跳
that.start();
},
start(){ //开启心跳
console.log('开启心跳');
var self = this;
self.timeoutObj && clearTimeout(self.timeoutObj);
self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
self.timeoutObj = setTimeout(function(){
//这里发送一个心跳,后端收到后,返回一个心跳消息,
if (self.ws.readyState == 1) {//如果连接正常
self.ws.send("heartCheck"); //这里可以自己跟后端约定
}else{//否则重连
self.reconnect();
}
self.serverTimeoutObj = setTimeout(function() {
//超时关闭
self.ws.close();
}, self.timeout);
}, self.timeout)
},
onopen() {
console.log("open");
//开启心跳
this.start();
},
onmessage(e) {
console.log('接收信息', e);
console.log('接收信息', e.data);
//下面这块代码,接收到后端返回的消息后,根据自己的需求去判断
if(e.data == 'heartCheck'){
// this.webInfo = '';
}else {
let data = JSON.parse(e.data);
if(data && data.length > 0){
let arr = [];
data.forEach(element => {
if(element.collectorId == localStorage.getItem('id')) {
arr.push(element);
return;
}
});
this.webInfo = arr;
console.log('this.webInfo--',this.webInfo);
}
}
//收到服务器信息,心跳重置
this.reset();
},
onclose(e) {
console.log("连接关闭");
console.log('websocket 断开: ' + e.code + ' ' + e.reason + ' ' + e.wasClean);
//重连
this.reconnect();
},
onerror(e) {
console.log("出现错误");
//重连
this.reconnect();
},
onsend(msg) {//向服务器发送信息
//数据发送
this.websock.send(msg);
},
},
}
这是本人最终用到的代码,新测真实有效
参考这篇文章
https://blog.csdn.net/kang19980516/article/details/104658081?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-104658081.nonecase&utm_term=vue%E4%B8%AD%20websocket%E5%BF%83%E8%B7%B3%E6%9C%BA%E5%88%B6&spm=1000.2123.3001.4430