WebSocketManager.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // utils/WebSocketManager.js
  2. import LocalWebSocket from './websocket.js';
  3. import IPDiscovery from './ipDiscovery.js';
  4. class WebSocketManager {
  5. constructor() {
  6. this.ws = LocalWebSocket;
  7. this.ipDiscovery = IPDiscovery;
  8. this.isAutoDiscovering = false;
  9. }
  10. // 初始化WebSocket连接
  11. async init() {
  12. // 首先尝试自动发现服务端
  13. await this.autoDiscoverAndConnect();
  14. // 设置默认回调
  15. this.setupDefaultCallbacks();
  16. }
  17. // 自动发现并连接
  18. async autoDiscoverAndConnect() {
  19. if (this.isAutoDiscovering) return;
  20. this.isAutoDiscovering = true;
  21. try {
  22. // 先尝试使用已保存的配置
  23. const savedConfig = this.ws.getConfig();
  24. const isAvailable = await this.ipDiscovery.checkWebSocketServer(
  25. savedConfig.ip,
  26. savedConfig.port
  27. );
  28. if (isAvailable) {
  29. console.log('使用已保存的配置连接WebSocket');
  30. this.ws.connect();
  31. } else {
  32. console.log('已保存的配置不可用,开始自动发现...');
  33. const discoveredConfig = await this.ipDiscovery.autoDiscoverServer();
  34. this.ws.updateServerConfig(discoveredConfig);
  35. this.ws.connect();
  36. }
  37. } catch (error) {
  38. console.error('自动发现服务端失败:', error);
  39. // 使用默认配置连接
  40. this.ws.connect();
  41. } finally {
  42. this.isAutoDiscovering = false;
  43. }
  44. }
  45. // 设置默认回调
  46. setupDefaultCallbacks() {
  47. this.ws.setOnOpen((event) => {
  48. console.log('WebSocket已连接');
  49. uni.$emit('websocket-connected');
  50. });
  51. this.ws.setOnMessage((event) => {
  52. try {
  53. const data = JSON.parse(event.data);
  54. // 通过事件总线发送消息
  55. uni.$emit('websocket-message', data);
  56. } catch (error) {
  57. console.error('解析WebSocket消息失败:', error);
  58. }
  59. });
  60. this.ws.setOnClose((event) => {
  61. console.log('WebSocket已断开');
  62. uni.$emit('websocket-disconnected');
  63. });
  64. this.ws.setOnError((error) => {
  65. console.error('WebSocket错误:', error);
  66. uni.$emit('websocket-error', error);
  67. });
  68. }
  69. // 发送消息
  70. sendMessage(data) {
  71. return this.ws.send(data);
  72. }
  73. // 更新服务端配置
  74. async updateServerConfig(config) {
  75. this.ws.updateServerConfig(config);
  76. // 重新连接
  77. this.ws.close();
  78. this.ws.connect();
  79. }
  80. // 获取当前配置
  81. getCurrentConfig() {
  82. return this.ws.getConfig();
  83. }
  84. // 手动连接
  85. connect() {
  86. this.ws.connect();
  87. }
  88. // 断开连接
  89. disconnect() {
  90. this.ws.close();
  91. }
  92. // 重新连接
  93. reconnect() {
  94. this.ws.close();
  95. this.ws.connect();
  96. }
  97. }
  98. export default new WebSocketManager();