/** * Author: Fu Guobin * Date: 2022/08/02 * Last Modified by: Fu Guobin * Last Modified time: 2023/09/15 * Copyright:Daniel(Fu Guobin) * Description:websocket方法封装 */ import mitt from '@/plugins/bus'; class WebSocketService { url: string; websocket: WebSocket | null; isInitialized: boolean; isConnected: boolean; heartbeatInterval: number; reconnectInterval: number; maxReconnectAttempts: number; reconnectAttempts: number; data: any; constructor() { this.url = ''; this.websocket = null; this.isInitialized = false; this.isConnected = false; //握手 this.heartbeatInterval = 30000; // 默认心跳30秒 this.reconnectInterval = 5000; // 默认重连5秒 this.maxReconnectAttempts = 5; // 默认尝试重连5次 this.reconnectAttempts = 0; this.data = null; } initialize(url: string): void { //初始化 this.url = url; this.websocket = new WebSocket(url); this.websocket.onopen = this.onOpen.bind(this); this.websocket.onclose = this.onClose.bind(this); this.websocket.onerror = this.onError.bind(this); this.websocket.onmessage = this.onMessage.bind(this); this.isInitialized = true; } onOpen(): void { this.isConnected = true; // 进行握手操作,如果需要的话 this.reconnectAttempts = 0; // 重置重连次数 this.startHeartbeat(); } onSend(data: any): void { //发送消息处理 console.log('websocketSend:', JSON.stringify(data)); if (this.isConnected) { this.websocket?.send(JSON.stringify(data)); } } onMessage(event: MessageEvent): void { //获取消息处理 if (event.data != '连接成功') { const response = JSON.parse(event.data); console.log('response:', response); this.data = response; // 处理返回的数据 if (response.code === 'datareal') { console.log('table'); mitt.emit('tableMessage', response); } else if (response.code === 'alertDev') { console.log('waring'); mitt.emit('waringMessage', response); } } } onClose(): void { // 关闭WebSocket连接的处理逻辑 this.isConnected = false; this.stopHeartbeat(); if (this.reconnectAttempts < this.maxReconnectAttempts) { setTimeout(() => { this.reconnectAttempts++; this.initialize(this.url); }, this.reconnectInterval); } } onError(error: Event): void { console.error('WebSocket error:', error); // 错误处理的逻辑 } startHeartbeat() { // 发送心跳 this.heartbeatInterval = setInterval(() => { if (this.websocket?.readyState === WebSocket.OPEN) { this.websocket.send('ping'); //心跳消息 } }, this.heartbeatInterval); } stopHeartbeat() { // 停止心跳 if (this.heartbeatInterval) { clearInterval(this.heartbeatInterval); this.heartbeatInterval = 0; } } close(): void { this.websocket?.close(); } } const webSocketService = new WebSocketService(); export default webSocketService;