是否可以暂停/挂起(不接受套接字上的(2))Node.js服务器?

时间:2016-12-19 22:56:09

标签: javascript node.js sockets server asyncsocket

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

我可以暂时删除connection上的server事件监听器,或者只通过调用once而不是on将其设置为一次,但随后没有connection事件监听器时所做的任何连接似乎都会丢失。从strace开始,我可以看到Node仍在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. 使用您选择的代理(localhostncsocat,...)连接到telnet,端口8080。
  2. 发送少于16个字节,并见证服务器登录到终端。
  3. 在不杀死第一个代理的情况下,在另一个终端中再次连接。尝试发送任意数量的字节 - 服务器不会记录任何内容。
  4. 在第一个连接上发送更多字节,以便在那里发送的总字节数超过16.服务器将关闭此连接(并再次将其记录到控制台)。
  5. 在第二个连接上发送更多字节。什么都不会发生。
  6. 我希望第二个连接阻塞,直到第一个连接结束,然后才能正常处理。这可能吗?

1 个答案:

答案 0 :(得分:1)

  

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

不幸的是,如果不捕获发送的连接事件并管理应用程序(而不是OS积压)中的已接受连接,就无法实现。节点使用OnConnection回调调用libuv,该回调将try to accept所有连接并使它们在JS上下文中可用。