【问题标题】:Correct way of reconnecting to the socket after ECONNRESET (Nodejs net.Socket)ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法
【发布时间】:2021-05-01 15:36:01
【问题描述】:

我正在使用本机 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 处理程序。

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

【问题讨论】:

  • 如果空闲一段时间后套接字关闭,请尝试:nodejs.org/api/…
  • @LawrenceCherone 谢谢你,先生,它解决了我的问题!请考虑将此添加为答案。再次感谢!

标签: node.js sockets


【解决方案1】:

正如@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/

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2014-12-10
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多