Node.js同时建立多台电子秤Socket连接失败(EISCONN错误)求助
解决Node.js复用同一Socket实例导致多电子秤连接失败的EISCONN错误
这个EISCONN错误我太熟了——你现在的问题核心是重复使用了同一个scaleconnect Socket对象去连接多台设备。Socket实例一旦建立连接后就处于"已连接"状态,再用它发起新的连接请求,Node.js就会抛出这个"连接已存在"的错误。
问题分析
看你的代码,每次调用handleRegister时,都是用同一个scaleconnect去连新的电子秤IP。第一个连接成功后,这个Socket已经和第一台秤绑定了,第二次调用connect自然就会触发冲突报错。
解决方案:为每个连接创建独立的Socket实例
你需要每次处理新的注册请求时,生成一个全新的Socket对象,每个电子秤对应一个独立的连接实例,这样就不会互相干扰了。下面是修改后的代码:
// 先确保引入net模块(假设你的scaleconnect是基于net.Socket实现的) const net = require('net'); var handleRegister = function (ip, userid) { // 关键:每次创建全新的Socket实例,每个电子秤对应独立连接 const scaleSocket = new net.Socket(); // 先绑定error事件,避免错过连接过程中的错误 scaleSocket.on('error', function(ex) { console.log(`电子秤${ip}连接失败:`, ex); // 可选:给对应用户推送连接失败的通知 io.to(userid).emit('scaleConnectFail', `无法连接到IP为${ip}的电子秤`); }); // 发起当前IP的连接请求 scaleSocket.connect(3002, ip, function() { console.log(`成功连接到电子秤${ip},关联用户ID:${userid}`); // 为当前连接绑定data事件,只接收这台秤的数据流 scaleSocket.on('data', function(data) { io.to(userid).emit('weighScale', data.toString('utf8')); }); // 可选:监听连接关闭事件,做后续状态同步 scaleSocket.on('close', function() { console.log(`与电子秤${ip}的连接已关闭`); io.to(userid).emit('scaleDisconnected', `与IP为${ip}的电子秤连接已断开`); }); }); // 可选:维护一个全局连接池,方便后续管理(比如主动断开连接) // global.scaleConnections = global.scaleConnections || {}; // global.scaleConnections[userid] = scaleSocket; }
改动说明
- 独立Socket实例:每次调用
handleRegister都新建net.Socket,保证每个电子秤的连接完全独立,不会互相占用资源 - 事件绑定顺序:先绑定
error事件再发起连接,避免连接过程中的错误被遗漏 - 专属数据流:每个Socket的
data事件只对应当前电子秤的数据,不会和其他连接的数据流混在一起 - 状态通知优化:新增了连接失败和断开的用户通知,提升交互体验
额外建议
- 如果需要主动断开某个用户的电子秤连接,可以从连接池中找到对应的Socket实例,调用
scaleSocket.destroy()方法 - 可以添加重连逻辑,当连接意外断开时自动尝试重新连接,提升系统稳定性
内容的提问来源于stack exchange,提问作者mohammed elfatih
相关产品推荐
相关产品推荐

