websocket连接
https://blog.csdn.net/qq_70071513/article/details/133171580
//暴露自定义websocket对象
export const socket = {
//后台请求路径
url: "",
//websocket对象
websocket: null,
//websocket状态
websocketState: false,
//重新连接次数
reconnectNum: 0,
//重连锁状态,保证重连按顺序执行
lockReconnect: false,
//定时器信息
timeout: null,
clientTimeout: null,
serverTimeout: null,
//初始化方法,根据url创建websocket对象封装基本连接方法,并重置心跳检测
initWebSocket(newUrl) {
socket.url = newUrl;
socket.websocket = new WebSocket(socket.url);
socket.websocket.onopen = socket.websocketOnOpen;
socket.websocket.onerror = socket.websocketOnError;
socket.websocket.onclose = socket.websocketOnClose;
this.resetHeartbeat()
},
reconnect() {
//判断连接状态
if (socket.lockReconnect) return;
socket.reconnectNum += 1;
//重新连接三次还未成功调用连接关闭方法
if (socket.reconnectNum === 3) {
socket.reconnectNum = 0;
socket.websocket.onclose()
return;
}
//等待本次重连完成后再进行下一次
socket.lockReconnect = true;
//5s后进行重新连接
socket.timeout = setTimeout(() => {
socket.initWebSocket(socket.url);
socket.lockReconnect = false;
}, 5000);
},
//重置心跳检测
resetHeartbeat() {
socket.heartbeat();
},
//心跳检测
heartbeat() {
socket.clientTimeout = setTimeout(() => {
if (socket.websocket) {
//向后台发送消息进行心跳检测
socket.websocket.send(JSON.stringify({ type: "heartbeat" }));
socket.websocketState = false;
//一分钟内服务器不响应则关闭连接
socket.serverTimeout = setTimeout(() => {
if (!socket.websocketState) {
socket.websocket.onclose()
} else {
this.resetHeartbeat()
}
}, 60 * 1000);
}
}, 3 * 1000);
},
//发送消息
sendMsg(message) {
socket.websocket.send(JSON.stringify({ type: "message", message: message}));
},
websocketOnOpen(event) {
//连接开启后向后台发送消息进行一次心跳检测
socket.websocket.send(JSON.stringify({ type: "heartbeat" }));
},
websocketOnError(error) {
console.log(error);
socket.reconnect();
},
websocketOnClose() {
socket.websocket.close();
},
};
2.引入websocket.js
//引入socket对象
import { socket } from "@/utils/websocket";
3.使用
created() {
this.getMessageNumber()
//初始化websocket对象
socket.initWebSocket(process.env.VUE_APP_BASE_WS + "/" + window.localStorage.getItem("webSocketKey"));
//绑定接收消息方法
socket.websocket.onmessage = this.websocketOnMessage;
},
beforeDestroy() {
// 组件销毁时关闭链接释放资源
socket.websocketOnClose()
},
methods: {
/** 初始化连接测试*/
init() {
socket.websocketOnOpen();
},
/** 接收websocket消息*/
websocketOnMessage(event) {
//初始化界面时,会主动向后台发送一次消息,获取数据
this.websocketCount += 1;
//没有发送成功则重新初始化一次
if (this.websocketCount === 0) {
this.init();
}
let info = JSON.parse(event.data);
switch (info.type) {
case "heartbeat":
socket.websocketState = true;
break;
case "message":
this.loading = true;
this.$nextTick(() => {
// 收到文本消息
this.consumeTextMessage(info)
//收到文件消息
//this.consumeFileMessage(info);
})
break;
case "error":
this.loading = false;
break;
}
},
/** 处理推送的文本数据 */
consumeTextMessage(info) {
const h = this.$createElement;
this.$notify({
title: '新的通知',
message: h('i', { style: 'color: teal'}, info.message)
});
},
/** 处理推送的文件数据 这里发送的是xlsx文件,可根据需求自定义,也可以将文件名一起从后端传过来 */
consumeFileMessage(info) {
let infoObj = info
//服务器向客户端推送文件 生成文件
Base64StrToFileUtil.downloadFileByBase64(infoObj.message, "01.xlsx")
}
}

浙公网安备 33010602011771号