web/src/utils/ws.ts

98 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ElMessageBox, ElMessage } from 'element-plus'; // 引入 ElementPlus 的 ElMessageBox 和 ElMessage 组件
let socket: WebSocket | null = null;
let reconnectAttempts = 0; // 重连次数计数器
const reconnectInterval = 3000; // 重连间隔时间,单位毫秒
let onMessageList = [] as ((response: Response) => void)[];
let onErrorList = [] as (() => void)[];
interface Response {
Code: number;
Message: string;
Data: any;
}
interface Request {
type: string;
data: any;
config?: any;
}
// 初始化 WebSocket 连接
const wsInit = (finish: () => void) => {
// 如果已经存在一个WebSocket连接先关闭它
if (socket && socket.readyState === WebSocket.OPEN) {
socket.close();
}
socket = new WebSocket('ws://localhost:8090');
socket.addEventListener('open', (event) => {
console.log('WebSocket连接已打开');
finish();
reconnectAttempts = 0; // 连接成功后重置重连计数器
});
// 监听错误事件
socket.addEventListener('error', (event) => {
console.log('WebSocket连接失败');
for(let i = 0; i < onErrorList.length; i++){
onErrorList[i]();
}
});
socket.addEventListener('message', (event) => {
console.log('收到服务器消息:', event.data);
let parsedMessage: Response = JSON.parse(event.data);
onMessageList.forEach(callback => {
callback(parsedMessage);
});
});
socket.onerror = (e) => e.stopImmediatePropagation();
// 监听连接关闭事件
socket.addEventListener('close', (event) => {
console.log("websocket连接异常")
});
};
// 设置消息回调函数
const wsSetMessageCallback = (onMessage: (response: Response) => void) => {
onMessageList.push(onMessage)
};
const wsRemoveMessageCallback = (onMessage: (response: Response) => void) => {
onMessageList = onMessageList.filter(callback => callback !== onMessage);
};
const wsRemoveAllMessageCallback = () => {
onMessageList = [];
};
const wsSend = (request: Request) => {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify(request));
} else {
wsInit(()=>{
wsSend(request);
})
}
};
const wsClose = () => {
if (socket) {
socket.close();
}
};
const wsSetErrorCallback=(onError: () => void)=>{
onErrorList.push(onError)
}
const wsRemoveAllErrorCallback=()=>{
onErrorList = [];
}
export {
wsInit,
wsSetMessageCallback,
wsRemoveAllMessageCallback,
wsRemoveMessageCallback,
wsSend,
wsClose,
wsSetErrorCallback,
wsRemoveAllErrorCallback,
type Response,
type Request,
};