如何解决Electron应用中Error: connect EISCONN ::1:5555错误?
问题分析与解决方案
错误根源
Error: connect EISCONN ::1:5555 是因为你在TCP服务器的客户端连接回调中,对已经处于连接状态的套接字再次调用了connect()方法。
在net.createServer()的回调函数里,参数socket是客户端发起连接后,服务器端自动创建的已连接套接字,此时它已经和客户端建立了连接,不需要再调用socket.connect()去连接端口——这会导致尝试对一个已连接的套接字发起新连接,触发EISCONN(Socket is already connected)错误。
修复代码
1. 移除错误的socket.connect()调用
直接删除两处net.createServer回调里的socket.connect(settings.port)语句即可解决核心错误。
2. 优化后的核心服务器代码(以mainWindow-ready中的服务器为例)
server = net.createServer(socket => { // 移除错误的socket.connect调用 socket.setKeepAlive(true); // 原有的数据处理逻辑保留,增加错误捕获 socket.on("data", data => { try { const rawData = data.toString().split("\n")[17].split(","); const parsedData = { id: rawData[0], state: rawData[1], updated_at: rawData[2], hostname: rawData[3], admin: rawData[4], level: rawData[5], purchased: rawData[6], connected: rawData[7], backdoored: rawData[8], cores: rawData[9], ram: { used: rawData[10], max: rawData[11], free: rawData[12], trueMax: rawData[13] }, power: rawData[14], organisation: rawData[15], isHome: rawData[16], ports: { required: rawData[17], open: rawData[18], ftp: rawData[19], http: rawData[20], smtp: rawData[21], sql: rawData[22], ssh: rawData[23] }, security: { level: rawData[24], min: rawData[25] }, money: { available: rawData[26], max: rawData[27], growth: rawData[28] } }; mainWindow.webContents.send("data-recieved", parsedData); } catch (err) { console.error("数据解析失败:", err); } finally { socket.destroy(); } }); // 增加套接字错误监听,避免未捕获异常 socket.on("error", err => { console.error("套接字错误:", err); }); });
3. 其他优化建议
- 代码复用:把服务器创建逻辑抽成单独函数,避免
mainWindow-ready和setting-update里重复写相同代码:function createTCPServer(port) { return net.createServer(socket => { socket.setKeepAlive(true); // 数据处理逻辑... }); } - Electron安全设置:
webPreferences中nodeIntegration: true在contextIsolation: true时会被忽略,建议保持contextIsolation: true,通过preload脚本暴露API,而非开启nodeIntegration。 - 文件操作修正:
fs.writeFileSync是同步方法,不需要传入回调函数,修正为:fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify(settings)); - 服务器关闭时机修正:
app.on('close')事件不存在,改为在before-quit事件中关闭服务器:app.on('before-quit', () => { if (server) server.close(); });
验证修复
移除socket.connect()调用后,启动应用时服务器会正常监听指定端口,客户端连接后可正常接收数据,不会再触发EISCONN错误。
内容的提问来源于stack exchange,提问作者CodeIsUnexecutable
相关产品推荐
相关产品推荐

