gpt4 book ai didi

Node.JS 网络模块处理意外的连接丢失

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:10 25 4
gpt4 key购买 nike

我无法解决我遇到的一个问题。我在 Node.JS 服务器上使用 Net 模块,该模块用于监听客户端连接。

客户端正确连接到服务器,并且该连接仍可用于读/写数据。到目前为止,一切都很好。但是,当客户端意外断开连接时(编辑。当客户端的互联网断开时)我想触发事件服务器端。

在socket.io中,它可以通过'disconnect'事件来完成,但是这个事件对于Net模块来说似乎不存在。怎么可能呢?

我在 Google/StackOverflow 和网络文档 ( https://nodejs.org/api/net.html ) 上进行了搜索,但找不到任何有用的东西。如果我做错了什么,我很抱歉。

这是我得到的代码片段:

var net = require('net');

var server = net.createServer(function(connection) {
console.log('client connected');
connection.wildcard = false;//Connection must be initialised with a configuration stored in the database
connection.bidirectional = true;//When piped this connection will be configured as bidirectional

connection.setKeepAlive(true, 500);
connection.setTimeout(3000);

connection.on('close', function (){
console.log('Socket is closed');
});

connection.on('error', function (err) {
console.log('An error happened in connection' + err.stack);
});
connection.on('end', function () {
console.log('Socket did disconnect');
});
connection.on('timeout', function () {
console.log('Socket did timeout');
connection.end();
});
connection.on('data', function (data) {
//Handling incoming data
});

});

serverUmrs.listen(40000, function () {
console.log('server is listening');
});

当我断开客户端连接(通过拔出 UTP 电缆)时,所有事件(关闭、结束、错误、超时)都不会触发。

提前致谢!

编辑:我确实在上面的代码中添加了一个超时事件,但唯一发生的事情是每次客户端再次连接时套接字都会在 3 秒后超时。 KeepAlive还不足以让socket不Idle吗?如何在没有太多开销的情况下使套接字不空闲。可能同时有超过 10,000 个连接,只要它们连接就必须保持事件状态(即响应 keepalive 消息)。

最佳答案

更新:

我认为KeepAlive套接字的空闲状态无关。

这是我的测试,我在您的示例中删除了以下代码。

//connection.setKeepAlive(true, 500);

然后使用一个客户端连接到该服务器来测试该服务器 var nc localhost 40000。如果3秒后没有消息发送到服务器,服务器日志如下

Socket did timeout
Socket did disconnect
Socket is closed

在没有 KeepAlive 设置的情况下触发 timeout 事件。

做进一步调查,引用Node.js code

function onread(nread, buffer) {
//...
self._unrefTimer();

我们知道timeout事件是由socket的onread()操作触发的。即,如果 3 秒后没有读取操作,则会发出 timeout 事件。更准确地说,不仅是onreadwrite成功也会调用_unrefTimer()

综上所述,当对套接字进行写或读操作时,它并不是空闲的。

<小时/>

实际上,close event 用于检测客户端连接是否处于事件状态,在本 SO question 中也提到过.

Emitted when the server closes. Note that if connections exist, this event is not emitted until all connections are ended.

但是,就您而言

disconnect the client(by pulling out the UTP cable).

timeout应该使用事件来检测连接不活动。这只是为了通知套接字已空闲。用户必须手动关闭连接。请引用这个question .

关于Node.JS 网络模块处理意外的连接丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com