繁体   English   中英

如何正确关闭 Node.js TCP 服务器?

[英]How to properly close a Node.js TCP server?

我在 Google 或 SO 上找不到明确的答案。

我知道net.Server实例有一个close方法,它不允许更多的客户端进入。但它不会断开已经连接的客户端。 我怎样才能做到这一点?

我知道如何使用 Http 来完成,我想我是在问 Tcp 是否相同或不同。

使用 Http,我会做这样的事情:

var http = require("http");

var clients = [];

var server = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("You sent a request.");
});

server.on("connection", function(socket) {
    socket.write("You connected.");
    clients.push(socket);
});

// .. later when I want to close
server.close();
clients.forEach(function(client) {
    client.destroy();
});

Tcp也一样吗? 还是我应该做些不同的事情?

由于没有提供答案,以下是如何在 node.js 中打开和(硬)关闭服务器的示例:

创建服务器:

var net = require('net');

var clients = [];
var server = net.createServer();

server.on('connection', function (socket) {
    clients.push(socket);
    console.log('client connect, count: ', clients.length);

    socket.on('close', function () {
        clients.splice(clients.indexOf(socket), 1);
    });
});

server.listen(8194);

关闭服务器:

// destroy all clients (this will emit the 'close' event above)
for (var i in clients) {
    clients[i].destroy();
}
server.close(function () {
    console.log('server closed.');
    server.unref();
});

更新:由于使用上述代码,我遇到了一个问题,即close将使端口保持打开状态(Windows 中的 TIME_WAIT)。 由于我故意关闭连接,我使用unref因为它似乎完全关闭了 tcp 服务器,但如果这是关闭连接的正确方法,我不是 100%。

我正在使用v16.13.2 ...当包含服务器代码的进程退出时,所有客户端连接默认关闭/销毁。

我来这里是为了了解如何监听server.("exit", myTaskCallback) ,因为我想在退出服务器时删除一些文件。 但我找到的答案是这样的事件不存在。 我必须听process.on('exit', myTaskCallback)来完成这项工作。

  1. 袜子.end(); //正确发送双方的连接结束
  2. sock.on("close", fn) //添加事件监听器来销毁所有相关的套接字和客户端
  3. sock.on("close", () => { sock.destroy() }) //销毁你的侧套接字包装器

例子:


  const closeConn = async (sock, cb) => {
    sock.ev.on("close", async ()=>{
      await sock?.destroy();
      if (typeof cb === "function") cb();
    });
    await sock?.end();
  }

  closeConn(sock, openSock);

你可以在这里查看更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM