如何检查localhost
的端口是否正常?
有没有标准算法?我正在考虑向该网址发出http
请求,并检查响应状态代码是否不是404
。
答案 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_REUSEADDR
和SO_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);
});