websocketService.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // src/services/websocketService.js
  2. import baseUrl from '@/utils/baseUrl';
  3. class WebSocketService {
  4. constructor() {
  5. this.ws = null;
  6. this.isConnected = false;
  7. this.messageListeners = [];
  8. }
  9. connect(token) {
  10. if (this.ws) {
  11. this.ws.close();
  12. }
  13. const baseUrls = baseUrl.WebsocketUrl; // 替换为你的 ws 地址
  14. const url = `${baseUrls}?token=${token}`;
  15. console.log('#############websocket url:', url);
  16. this.ws = new window.WebSocket(url);
  17. this.ws.onopen = () => {
  18. this.isConnected = true;
  19. console.log('[WebSocket] 连接成功');
  20. };
  21. this.ws.onmessage = (event) => {
  22. console.log('#############websocket event:', event);
  23. let message;
  24. try {
  25. // 尝试解析为 JSON
  26. message = JSON.parse(event.data);
  27. } catch (error) {
  28. // 如果不是 JSON 格式,直接使用原始字符串
  29. message = event.data;
  30. }
  31. console.log('#############websocket message:', message);
  32. this.messageListeners.forEach(cb => {
  33. if (typeof cb === 'function') {
  34. cb(message);
  35. }
  36. });
  37. };
  38. this.ws.onclose = (event) => {
  39. this.isConnected = false;
  40. console.log('[WebSocket] 连接关闭', event);
  41. };
  42. }
  43. send(data) {
  44. if (this.ws && this.isConnected) {
  45. // 如果 data 是字符串,直接发送;否则转换为 JSON
  46. const message = typeof data === 'string' ? data : JSON.stringify(data);
  47. this.ws.send(message);
  48. }
  49. }
  50. addMessageListener(cb) {
  51. this.messageListeners.push(cb);
  52. }
  53. removeMessageListener(cb) {
  54. this.messageListeners = this.messageListeners.filter(fn => fn !== cb);
  55. }
  56. getReadyState() {
  57. // 0: CONNECTING, 1: OPEN, 2: CLOSING, 3: CLOSED
  58. return this.ws ? this.ws.readyState : null;
  59. }
  60. }
  61. const wsService = new WebSocketService();
  62. export default wsService;