如果端口忙于EADDRINUSE
,我尝试根据8000增加端口号,我认为它就像下面这样简单:
var tryToOpenServer = function(port)
{
console.log('trying to Open: ' + port);
HTTPserver
.listen(port, function()
{
console.log('HTTP listening:' + port);
})
.on('error', function(err)
{
if (err.code === 'EADDRINUSE')
{
// port is currently in use
console.log('server Open error:' + port);
tryToOpenServer(port + 1);
}
});
};
tryToOpenServer(8000);
如果端口:8000正忙且得到err.code
==='EADDRINUSE',则端口递增并且代码尝试端口。问题是
.listen(port, function()
{
console.log('HTTP listening:' + port);
})
上面的代码以某种方式成功运行在端口:8000甚至它抛出'EADDRINUSE',所以我有2个通知:HTTP 8000和8001.
我想念什么?请让我知道谢谢。
答案 0 :(得分:1)
这是一个坏主意。
您的递归会以指数方式创建侦听器。
如果我们修改您的代码at this Gist以跟踪创建的每个侦听器,我们可以看到会发生什么。当我运行代码并且端口8000可用时,一切都很好..
当8000忙时8001可用,我开始看到多个听众......:
trying to Open: 8000
server Open error:8000
we have created 1 error event handler from 0
trying to Open: 8001
we have created 1 http server from caller 0
HTTP listening:8000
we have created 2 http server from caller 1
HTTP listening:8001
尝试端口8000的第一个侦听器不会消失。
更糟糕的是,错误监听器也不会消失。随着更多错误侦听器的创建,每个错误都会触发。
当我运行原始代码并且8000和8001都忙时,我得到these results 七个错误事件侦听器和8个http侦听器函数。
第四次,计数在32k范围内,节点正在发出有关泄漏的警告。
基于Node's net documentation的代码,更好的方法可能如下所示。单个错误处理程序可以在每次出现时处理EADDRINUSE
错误:
var http = require('http');
var port = 8000;
var HTTPserver = http.createServer(function (request, response) {
response.writeHead(200);
response.end("hello from server on port: " + port);
});
console.log('trying to Open: ' + port);
HTTPserver
.listen(port, function () {
console.log('we have created ' + listenerCounter + ' http server listeners');
listenerCounter++;
console.log('HTTP listening:' + port);
})
.on('error', function (err) {
if (err.code === 'EADDRINUSE') {
port++;
console.log('Address in use, retrying on port ' + port);
setTimeout(function () {
HTTPserver.listen(port);
}, 250);
}
});
答案 1 :(得分:1)
轻松使用portscanner
https://github.com/baalexander/node-portscanner
portscanner.findAPortNotInUse(8000, 9000, '127.0.0.1', function(error, port) {
console.log('AVAILABLE PORT AT: ' + port)
})
答案 2 :(得分:0)
这很有效,很简单:
var port = 8000;
HTTPserver
.listen(port, function()
{
console.log('HTTP listening:' + port);
})
.on('error', function(err)
{
if (err.code === 'EADDRINUSE')
{
// port is currently in use
console.log('server Open error:' + port);
port++;
HTTPserver
.listen(port);
}
});