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

Node.js Net模块部署EC2后IoT设备TCP连接异常求助

Node.js TCP服务器部署AWS EC2后连接异常及IoT设备无法接入问题

我用Node.js的net模块创建了如下TCP服务器:

// Creating and connecting with server
const net = require('net');
const server = net.createServer(); //Creating server

//Connecting with server
server.on('connection', function (socket) {
    let remoteAddress = `${socket.remoteAddress},${socket.remotePort}`

    console.log(remoteAddress)
    console.log(`connection is established... ${Date.now()} \n `);
    socket.write(`connection is established...${Date.now()} \n`);
    //Receiving and Sending payload from/to client
    socket.on('data', async function (payload) {
        console.log("payload from client",payload)
        socket.write(`acknowledge : ${payload}`);
    });
    //Close connection
    socket.on('close', function () {
        console.log('Server Connection Closed');
    });
    //Server error
    socket.on('error', function (err) {
        console.log("Caught flash policy server socket error: ")
        console.log(err.stack)
    });
});

server.listen(8001, function () {
    console.log('Server Listing on Port 8001');
 })

部署到AWS EC2实例后遇到两个问题:

  • 使用telnet ec2_ip 8001连接时,初期可正常交互,但一段时间后出现异常错误
  • 真实IoT电动滑板车无法建立到EC2 8001端口的连接

问题排查与解决方案

1. AWS网络配置检查

  • 安全组规则:确认EC2安全组的入站规则已开放TCP 8001端口,来源可临时设为0.0.0.0/0(测试用),或限定设备IP范围;出站规则允许任意TCP流量
  • 网络ACL:检查子网关联的网络ACL,确保入站/出站规则均允许8001端口的TCP数据包通过
  • 公网IP稳定性:确认EC2实例绑定了弹性IP,避免重启后IP变化导致连接失败

2. TCP服务器代码优化

原代码存在几个潜在问题,优化后的代码如下:

const net = require('net');
const server = net.createServer();

server.on('connection', function (socket) {
    const remoteAddress = `${socket.remoteAddress}:${socket.remotePort}`;
    console.log(`New connection from ${remoteAddress} at ${Date.now()}`);
    
    // 设置连接超时,释放空闲连接资源
    socket.setTimeout(60000);
    // 统一字符编码,避免Buffer乱码
    socket.setEncoding('utf8');
    
    socket.write(`Connection established at ${Date.now()}\n`);

    socket.on('data', function (payload) {
        console.log(`Payload from ${remoteAddress}: ${payload.trim()}`);
        socket.write(`Acknowledged: ${payload}`);
    });

    // 监听客户端主动关闭连接事件
    socket.on('end', function () {
        console.log(`Connection from ${remoteAddress} ended`);
    });

    socket.on('close', function () {
        console.log(`Connection with ${remoteAddress} closed`);
    });

    // 处理超时连接,主动释放资源
    socket.on('timeout', function () {
        console.log(`Connection from ${remoteAddress} timed out, closing`);
        socket.end();
    });

    // 修正错误日志标识,便于定位问题
    socket.on('error', function (err) {
        console.log(`Socket error from ${remoteAddress}:`);
        console.error(err.stack);
    });
});

server.listen(8001, function () {
    console.log('Server listening on port 8001');
});

优化点说明:

  • 移除无意义的async修饰符,避免异步逻辑干扰
  • 添加end事件监听,处理客户端主动断开的场景
  • 设置socket超时和统一编码,避免资源泄漏和乱码
  • 修正错误日志的描述,更贴合TCP服务场景

3. IoT设备连接问题排查

  • 设备网络环境:确认滑板车处于可访问公网的网络中,没有防火墙或代理限制TCP 8001端口的出站流量
  • 设备协议匹配:部分IoT设备使用自定义二进制协议或MQTT等专用协议,而非简单文本交互,当前服务器仅处理文本数据,可能无法识别设备的连接请求格式,导致设备主动断开。可先用nc -lvp 8001在EC2上启动临时TCP监听,验证设备是否能发送数据
  • 设备配置检查:查看滑板车的设置界面,确认是否需要添加服务器IP到白名单,或配置特定的连接参数(如心跳间隔、协议版本)

4. EC2实例系统层面检查

  • 资源监控:通过AWS控制台查看EC2实例的CPU、内存使用率,避免资源耗尽导致服务器无响应
  • 系统日志:查看EC2系统日志(/var/log/syslog或/var/log/messages),排查是否有内核级网络错误或Node.js进程崩溃记录
  • 进程守护:使用pm2等进程管理工具托管Node.js服务,避免进程意外退出后无法自动重启

内容的提问来源于stack exchange,提问作者manzt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:18:38