You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:35:30