import SockJS from 'sockjs-client/dist/sockjs.min.js'; // 确保导入正确的 SockJS 文件 import { Client } from '@stomp/stompjs'; let stompClient = null; let subscriptions = {}; // 用于存储订阅,方便取消 const connect = (onConnectedCallback, onErrorCallback) => { // 后端 WebSocket 端点 URL (根据实际部署情况可能需要修改) // 注意:如果后端运行在不同端口,需要写完整 URL,例如 'http://localhost:8080/ws' // 如果前后端同源,可以直接用 '/ws' const socket = new SockJS('http://localhost:8085/ws'); // 使用后端配置的端点 (修改为绝对路径) stompClient = new Client({ webSocketFactory: () => socket, reconnectDelay: 5000, // 自动重连延迟 heartbeatIncoming: 4000, heartbeatOutgoing: 4000, onConnect: (frame) => { console.log('WebSocket Connected: ' + frame); if (onConnectedCallback) { onConnectedCallback(frame); } }, onStompError: (frame) => { console.error('Broker reported error: ' + frame.headers['message']); console.error('Additional details: ' + frame.body); if (onErrorCallback) { onErrorCallback(frame); } }, onWebSocketError: (error) => { console.error('WebSocket Error: ', error); if (onErrorCallback) { onErrorCallback(error); } }, onDisconnect: () => { console.log('WebSocket Disconnected'); // 清理所有订阅 subscriptions = {}; } }); stompClient.activate(); }; const subscribe = (destination, callback) => { if (stompClient && stompClient.connected) { console.log(`Subscribing to ${destination}`); const subscription = stompClient.subscribe(destination, (message) => { console.log(`Message received from ${destination}:`, message.body); if (callback) { try { callback(JSON.parse(message.body)); } catch (e) { console.error("Error parsing message body:", e); callback(message.body); // 如果解析失败,返回原始 body } } }); subscriptions[destination] = subscription; // 存储订阅 return subscription; } else { console.error('Cannot subscribe, Stomp client not connected.'); return null; } }; const unsubscribe = (destination) => { if (subscriptions[destination]) { console.log(`Unsubscribing from ${destination}`); subscriptions[destination].unsubscribe(); delete subscriptions[destination]; // 从存储中移除 } }; const disconnect = () => { if (stompClient && stompClient.connected) { stompClient.deactivate(); console.log('WebSocket connection deactivated.'); } // 即使未连接,也尝试清理 stompClient 实例 stompClient = null; subscriptions = {}; // 清空订阅记录 }; // 可选:发送消息的方法 (如果需要前端主动发消息) const sendMessage = (destination, body) => { if (stompClient && stompClient.connected) { stompClient.publish({ destination: destination, body: JSON.stringify(body) }); } else { console.error('Cannot send message, Stomp client not connected.'); } }; export { connect, subscribe, unsubscribe, disconnect, sendMessage };