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)
使用一次性事件处理程序,您可以将其包装到异步检查功能中.
查看令人惊奇的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_REUSEADDR和SO_REUSEPORT,如通过@StevenVachon提到的).
在端口扫描工具NPM模块会发现免费使用的端口为你的范围内,如果你想找到一个打开的端口绑定是比较有用的.
感谢 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)