4

我一直在测试Node.js TCP 套接字中 keepalive 的功能。看来我在这里遗漏了一些东西!

这是我的服务器代码:

var net = require('net');
function accept(socket) {
    socket.setKeepAlive(false);
    socket.on('data', function(data) {
        console.log("DATA");
        console.log(data);
    });
    socket.on('error', function (e) {
        console.log("ERROR");
        console.log(e);
    });
    socket.on('close', function () {
        console.log("CLOSE");
    });
    socket.on('end', function () {
        console.log("END");
    });
    socket.write("Hi");
}
var server = net.createServer(accept);
server.listen(8011);

这是我的客户代码:

var net = require('net');
var socket = new net.Socket();
socket.setKeepAlive(false);
socket.on('data', function(data) {
    console.log("DATA");
    socket.write(data);
});
socket.on('error', function (e) {
    console.log("ERROR");
    console.log(e);
});
socket.on('close', function () {
    console.log("CLOSE");
});
socket.on('end', function () {
    console.log("END");
});
socket.connect(8011, '127.0.0.1');

为什么服务器(或客户端)即使长时间(120秒)没有发送或接收数据也不会关闭连接?

我正在使用 Node.js 0.10.5 版!

4

1 回答 1

3

因为keep-alive在较低级别上工作。它发送一个没有任何数据有效负载的检查包,如果没有答案,则认为连接断开。

尝试做同样的事情,但从其中一台机器上拔下以太网电缆。

编辑0:

对不起,误读了你的代码。

TCP keep-alive 特性通常被称为“dead peer detection”。例如,在此处阅读有关其机制的信息。禁用 keep-alive 后,TCP 本身不会在任何不活动超时后强制关闭连接。像 NAT-ing 路由器这样的中间设备可能会过期并中断您的连接,而不是通信端本身。

于 2013-05-15T19:35:43.077 回答