节点http服务器EADDRINUSE和下一个端口

时间:2014-03-07 22:43:45

标签: node.js httpserver

如果端口忙于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.

我想念什么?请让我知道谢谢。

3 个答案:

答案 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);
        }
      });