是否可以暂停/暂停(不要在插座上接受(2))node.js服务器



目标:具有一个node.js服务器,其中只有一个连接处于活动状态。

我可以在server上暂时删除connection事件侦听器,或者仅通过调用once而不是on来首先设置一次,但是在没有connection事件侦听器的情况下,任何连接都可以丢失。。从strace中,我可以看到插座上的节点仍在accept(2)。是否可以让它不执行此操作,以便将内核排队所有传入请求,直到服务器准备好再次将其 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. 连接到localhost,端口8080,带有您选择的代理(ncsocattelnet,…)。
  2. 发送少于16个字节,并见证服务器记录到终端。
  3. 在不杀死第一代理的情况下,第二次连接另一个终端。尝试发送任意数量的字节 - 服务器不会记录任何内容。
  4. 在第一个连接上发送更多字节,以便在此处发送的字节总数超过16。服务器将关闭此连接(然后再次将其记录到控制台)。
  5. 在第二个连接上发送更多字节。什么都不会发生。

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

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

不幸的是,如果不捕获发送的连接事件并管理应用程序中可接受的连接,而不是使用OS积压,则是不可能的。节点调用带有连接回调的libuv,该回调将尝试接受所有连接并在JS上下文中提供它们。

相关内容

  • 没有找到相关文章