ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法
Posted
技术标签:
【中文标题】ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法【英文标题】:Correct way of reconnecting to the socket after 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'
当我收到close
或error
事件时,我想重新建立连接。
当我捕捉到这些事件时,我曾尝试使用reader.connect()
,就像我最初在上面所做的那样。
但是,此后我没有从套接字收到任何 data
,即永远不会调用 data
处理程序。
在这种情况下重新连接到套接字的正确方法是什么?
【问题讨论】:
如果空闲一段时间后套接字关闭,请尝试:nodejs.org/api/… @LawrenceCherone 谢谢你,先生,它解决了我的问题!请考虑将此添加为答案。再次感谢! 【参考方案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/
【讨论】:
以上是关于ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs Socket 挂断和 ECONNRESET - 从 Meteor 到 Node js 服务器的 HTTP 发布请求
ECONNRESET(Nodejs net.Socket)后重新连接到套接字的正确方法
NodeJS:错误:在 TCP.onStreamRead (internal/stream_base_commons.js:111:27) 读取 ECONNRESET
Nodejs 套接字报错处理 Error: read ECONNRESET
Postman 卡在“GET”请求中,在使用 PostgreSQL 作为后端的 Node JS 中给出“无法获得响应错误:读取 ECONNRESET”的错误