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
相关产品推荐
相关产品推荐

