this.socket.on('open', () => { console.log('[OpenClaw] ✅ WebSocket 连接已建立'); console.log('[OpenClaw] 就绪状态:', this.socket.readyState, '(1=OPEN)'); this.isConnected = true; this.reconnectAttempts = 0; // 检查窗口是否存在 if (mainWindow && !mainWindow.isDestroyed()) { this.eventHandler('connected'); } // 主动发送 connect 请求(兼容模式:不等待 challenge) console.log('[OpenClaw] 📤 准备发送 connect 请求...'); this.sendConnect(); }); this.socket.on('message', (data) => { // 窗口已关闭时忽略消息 if (!mainWindow || mainWindow.isDestroyed()) { return; } try { const messageStr = data.toString(); console.log('[OpenClaw] 📥 收到消息 (长度:', messageStr.length, '字节)'); console.log('[OpenClaw] 原始数据:', messageStr.substring(0, 500) + (messageStr.length > 500 ? '...' : '')); const message = JSON.parse(messageStr); console.log('[OpenClaw] 消息类型:', message.type); if (message.type === 'event') { console.log('[OpenClaw] 事件名称:', message.event); } else if (message.type === 'res') { console.log('[OpenClaw] 响应 ID:', message.id); console.log('[OpenClaw] 响应状态:', message.ok ? '✅ 成功' : '❌ 失败'); if (!message.ok) { console.log('[OpenClaw] 错误信息:', message.error); } } // 处理 connect.challenge 质询 if (message.type === 'event' && message.event === 'connect.challenge') { console.log('[OpenClaw] 🔐 收到 challenge 质询'); console.log('[OpenClaw] Nonce:', message.payload?.nonce); console.log('[OpenClaw] 发送 connect 请求响应 challenge...'); this.sendConnect(message.payload?.nonce); return; } this.handleMessage(message); } catch (error) { console.error('[OpenClaw] ❌ 解析消息错误:', error.message); console.error('[OpenClaw] 原始数据:', data.toString().substring(0, 200)); } }); this.socket.on('close', (event) => { console.log('[OpenClaw] 🔴 WebSocket 连接已关闭'); console.log('[OpenClaw] 关闭代码:', event.code); console.log('[OpenClaw] 关闭原因:', event.reason || '无'); console.log('[OpenClaw] 是否干净关闭:', event.wasClean); console.log('[OpenClaw] 就绪状态:', this.socket.readyState, '(3=CLOSED)'); this.isConnected = false; // 检查窗口是否存在 if (mainWindow && !mainWindow.isDestroyed()) { this.eventHandler('disconnected'); } // 根据关闭代码给出建议 if (event.code === 1006) { console.log('[OpenClaw] ⚠️ 异常关闭(1006)- 可能是网络问题或服务器拒绝连接'); } else if (event.code === 1002) { console.log('[OpenClaw] ⚠️ 协议错误(1002)- 服务器不支持的协议'); } else if (event.code === 1003) { console.log('[OpenClaw] ⚠️ 数据类型错误(1003)- 服务器不接受的数据格式'); } else if (event.code === 1008) { console.log('[OpenClaw] ⚠️ 策略违规(1008)- 违反服务器策略'); } else if (event.code === 1011) { console.log('[OpenClaw] ⚠️ 服务器错误(1011)- 服务器遇到问题'); } this.scheduleReconnect(); }); this.socket.on('error', (error) => { console.error('[OpenClaw] ❌ WebSocket 错误:', error.message); console.error('[OpenClaw] 错误类型:', error.constructor.name); console.error('[OpenClaw] 错误堆栈:', error.stack?.split('\n').slice(0, 3).join('\n')); // 检测 SSL/TLS 错误并给出建议 if (error.message?.includes('WRONG_VERSION_NUMBER')) { console.error('[OpenClaw] 🔴 SSL/TLS 协议不匹配!'); console.error('[OpenClaw] 可能原因:'); console.error('[OpenClaw] 1. 使用 wss:// 但服务器只支持 ws://'); console.error('[OpenClaw] 2. 使用 ws:// 但服务器只支持 wss://'); console.error('[OpenClaw] 3. SSL 证书问题(自签名/过期)'); console.error('[OpenClaw] 建议:'); console.error('[OpenClaw] - 尝试改用 ws://(非加密)'); console.error('[OpenClaw] - 确认端口是否正确'); console.error('[OpenClaw] - 检查服务器是否正常运行'); } else if (error.message?.includes('ECONNREFUSED')) { console.error('[OpenClaw] 🔴 连接被拒绝 - 服务器可能未启动或防火墙阻止'); } else if (error.message?.includes('ETIMEDOUT')) { console.error('[OpenClaw] 🔴 连接超时 - 网络问题或服务器无响应'); } else if (error.message?.includes('ENOTFOUND')) { console.error('[OpenClaw] 🔴 域名解析失败 - 检查 URL 是否正确'); } // 检查窗口是否存在 if (mainWindow && !mainWindow.isDestroyed()) { this.eventHandler('error', { error: error.message, hint: error.message?.includes('WRONG_VERSION_NUMBER') ? 'SSL 协议不匹配,请检查是否应该使用 ws://而不是 wss://' : null }); } });