【问题标题】:Is it possible to pause/suspend (don’t accept(2) on the socket) a Node.js server?是否可以暂停/挂起(在套接字上不接受(2))Node.js 服务器?
【发布时间】:2017-05-05 01:55:42
【问题描述】:

目标:拥有一个 Node.js 服务器,每次只有一个连接处于活动状态。

我可以暂时删除server 上的connection 事件侦听器,或者首先通过调用once 而不是on 只设置一次,然后在存在时建立任何连接没有connection 事件监听器似乎迷路了。从strace,我可以看到Node 还在socket 上accept(2)ing。是否有可能让它不这样做,以便内核将所有传入请求排队,直到服务器准备好再次accept它们(或超过listen(2)中配置的积压)?

无法按我的意愿工作的示例代码:

#!/usr/bin/node
const net = require("net");
const server = net.createServer();
function onConnection(socket) {
    socket.on("close", () => server.once("connection", onConnection));
    let count = 0;
    socket.on("data", (buffer) => {
        count += buffer.length;
        if (count >= 16) {
            socket.end();
        }
        console.log("read " + count + " bytes total on this connection");
    });
}
server.once("connection", onConnection);
server.listen(8080);
  1. 使用您选择的代理(ncsocattelnet,...)连接到 localhost,端口 8080。
  2. 发送少于 16 个字节,见证服务器登录到终端。
  3. 在不杀死第一个代理的情况下,在另一个终端中再次连接。尝试发送任意数量的字节 - 服务器不会记录任何内容。
  4. 在第一个连接上发送更多字节,这样在那里发送的字节总数超过 16。服务器将关闭此连接(并再次将其记录到控制台)。
  5. 在第二个连接上发送更多字节。什么都不会发生。

我希望阻止第二个连接,直到第一个连接结束,然后才能正常处理。这可能吗?

【问题讨论】:

    标签: javascript node.js sockets server asyncsocket


    【解决方案1】:

    .. 以便内核将所有传入请求排队,直到服务器准备好再次接受它们(或者超过了在 listen(2) 中配置的积压)? ... 我希望第二个连接阻塞,直到第一个连接结束,然后正常处理。这可能吗?

    不幸的是,如果不捕获发送的连接事件并管理应用程序中接受的连接,而不是操作系统积压,这是不可能的。 node 使用 OnConnection 回调调用 libuv,该回调将 try to accept 所有连接并使它们在 JS 上下文中可用。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2015-09-10
      • 2014-04-12
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2015-12-16
      相关资源
      最近更新 更多