如何检查NodeJS中的端口是否繁忙?

Ion*_*zău 11 javascript node.js

如何检查,如果端口忙localhost

有没有标准的算法?我正在考虑http向该URL 发出请求并检查响应状态代码是否不正确404.

hex*_*ide 14

您可以尝试启动服务器,无论是TCP还是HTTP,都没关系.然后你可以尝试开始监听端口,如果失败,检查错误代码是否正确EADDRINUSE.

var net = require('net');
var server = net.createServer();

server.once('error', function(err) {
  if (err.code === 'EADDRINUSE') {
    // port is currently in use
  }
});

server.once('listening', function() {
  // close the server if listening doesn't fail
  server.close();
});

server.listen(/* put the port to check here */);
Run Code Online (Sandbox Code Playgroud)

使用一次性事件处理程序,您可以将其包装到异步检查功能中.

  • 这不适用于未使用`SO_REUSEADDR`的服务器.查看https://github.com/baalexander/node-portscanner,了解他们如何使用`net.Socket()`来解决这个问题. (4认同)
  • 您还应该等到服务器关闭...通过监听服务器关闭事件 `server.once('close', () => { myFunc() }).close()` (3认同)

Cod*_*ing 7

查看令人惊奇的tcp-port-used节点模块!

//Check if a port is open
tcpPortUsed.check(port [, host]) 

 //Wait until a port is no longer being used
tcpPortUsed.waitUntilFree(port [, retryTimeMs] [, timeOutMs])

//Wait until a port is accepting connections
tcpPortUsed.waitUntilUsed(port [, retryTimeMs] [, timeOutMs])

//and a few others!
Run Code Online (Sandbox Code Playgroud)

我已经使用这些来完成我的gulp watch任务,以检测我的Express服务器何时被安全终止以及何时再次旋转.

这将准确地报告一个端口是否绑定与否(无论SO_REUSEADDRSO_REUSEPORT,如通过@StevenVachon提到的).

端口扫描工具NPM模块会发现免费使用的端口为你的范围内,如果你想找到一个打开的端口绑定是比较有用的.


Ido*_*Ido 5

感谢 Steven Vachon 链接,我做了一个简单的例子:

const net = require("net");
const Socket = net.Socket;

const getNextPort = async (port) =>
{
    return new Promise((resolve, reject) =>
    {
        const socket = new Socket();

        const timeout = () =>
        {
            resolve(port);
            socket.destroy();
        };

        const next = () =>
        {
            socket.destroy();
            resolve(getNextPort(++port));
        };

        setTimeout(timeout, 10);
        socket.on("timeout", timeout);

        socket.on("connect", () => next());

        socket.on("error", error =>
        {
            if (error.code !== "ECONNREFUSED")
                reject(error);
            else
                resolve(port);
        });

        socket.connect(port, "0.0.0.0");
    });
};

getNextPort(8080).then(port => {
    console.log("port", port);
});
Run Code Online (Sandbox Code Playgroud)