node.js - ECONNRESET 后重新连接到套接字的正确方法(Nodejs net.Socket)

标签 node.js sockets

我正在使用 native Nodejs net 模块通过 LAN 建立与硬件设备的套接字连接。 我已经实现了一些事件处理程序,例如,我正在监听 data 事件,一切都按预期进行!

const net = require('net');
let reader = new net.Socket();

reader.connect(READER_PORT, READER_IP);

// Some event handlers, working perfectly fine...
reader.on('data', (data) => {
    // Process the data           
});

reader.on('close', (error) => {
   // Reconnect here
});

但是,当我大约 5-10 分钟不使用连接(它保持空闲)时,它会自动关闭自己,并发出 close 事件并出现以下错误:

read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:208:20) {
  errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read'
}

我想在收到 closeerror 事件时重新建立连接。 当我捕获到这些事件时,我尝试使用 reader.connect() ,就像我最初在上面所做的那样。 但是,此后我没有从套接字接收到任何 data,即永远不会调用 data 处理程序。

在这种情况下,重新连接到套接字的正确方法是什么?

最佳答案

正如@Lawrence Cherone 所提到的,如果空闲,套接字会在一段时间后关闭。 为了解决这个问题,需要启用 TCP keep-alive。

对于 Node.js(net 模块),可以使用 socket.setKeepAlive() 方法(https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay)启用它。 它解决了我的问题。

2021 年更新

我在我的文章中详细地写了一切: https://abdullaev.dev/how-to-integrate-nodejs-with-uhf-rfid-reader/

关于node.js - ECONNRESET 后重新连接到套接字的正确方法(Nodejs net.Socket),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65925285/

相关文章:

jquery - 直接从客户端访问Mongodb

c++ - 提升套接字 read_until 用于结构

windows - 套接字在同一台 PC 上的通信是否比使用共享内存慢得多?

sockets - 配置 channel 测试超时 Phoenix

node.js - AWS Redis Reader 端点和 ioredis

javascript - 修复不和谐音乐机器人队列

node.js - 在多个 Node 上部署 socket.io 应用程序

javascript - Socket.emit() 和/或 socket.on() 不起作用

java - 套接字是否可以在没有端口转发的情况下连接到 SeverSocket(0)?

linux - 在 netstat 中检索套接字状态的系统调用是什么?