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

时间:2013-10-02 03:33:47

标签: javascript node.js

如何检查localhost端口是否正常

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

3 个答案:

答案 0 :(得分: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 */);

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

答案 1 :(得分:6)

查看惊人的tcp-port-used node module

//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!

我使用gulp watch任务来检测我的Express服务器何时被安全终止以及何时再次启动时使用了这些功能。

这将准确报告端口是否绑定(无论SO_REUSEADDRSO_REUSEPORT,如@StevenVachon所述。

portscanner NPM module会在范围内为您找到免费和使用的端口,如果您正在尝试找到要绑定的开放端口,则会更有用。

答案 2 :(得分:1)

感谢 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, 200);
        socket.on("timeout", timeout);

        socket.on("connect", function () {
            next();
        });

        socket.on("error", function (exception) {
            if (exception.code !== "ECONNREFUSED") {
                reject(exception);
            } else {
                next();
            }
        });

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

getNextPort(8080).then(port => {
    console.log("port", port);
});