节点httpServer EADDRINUSE和下一个端口 [英] node httpServer EADDRINUSE and next port

查看:66
本文介绍了节点httpServer EADDRINUSE和下一个端口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果端口忙于EADDRINUSE,我尝试基于8000递增端口号,我认为这很简单,如下所示:

I try to increment a port number based on 8000 if the port is busy with EADDRINUSE, and I thought it's as easy as the below:

            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',则该端口递增,并且代码尝试该端口.问题是

If the port:8000 is busy and got err.code === 'EADDRINUSE', the port is incremented and the code tries the port. The problem is that

                .listen(port, function()
                {
                  console.log('HTTP listening:' + port);
                })

上面的代码以某种方式成功地在端口8000上运行,即使它抛出了"EADDRINUSE",所以我有2条通知:HTTP 8000和8001.

The above code somehow successfully runs on port:8000 even it throws an 'EADDRINUSE', so I've got 2 notifications: HTTP 8000 and 8001.

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

What do I miss? Please let me know thanks.

推荐答案

这是一个坏主意.

您的递归会成倍地创建侦听器.

Your recursion creates listeners exponentially.

如果我们在此要点上修改您的代码 来跟踪每个侦听器创建后,我们可以看到会发生什么.当我运行代码并且端口8000可用时,一切都很好..

If we modify your code at this Gist to track each listener that is created, we can see what happens. When I run the code and port 8000 is available, things are fine..

当8000忙时8001可用时,我开始看到多个侦听器..

When 8000 is busy 8001 is available, I start to see multiple listeners..:

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的第一个侦听器不会消失.

The first listener from trying port 8000 doesn't disappear.

更糟糕的是,错误侦听器也不会消失.随着创建更多错误侦听器,每个错误都会触发.

Worse, the error listener doesn't disappear either. As more error listeners are created, every one fires on each error.

当我运行您的原始代码并且8000和8001都忙时,我得到

When I run your original code and both 8000 and 8001 are busy, I get these results with seven error event listeners and eight http listener functions created.

第四次,计数在32k范围内,并且节点发出有关泄漏的警告.

The fourth time, counts were in the 32k range and node was throwing warnings about leaks.

基于节点的网络文档的代码,一种更好的方法可能看起来像这.单个错误处理程序每​​次都可以处理EADDRINUSE错误:

A better way, based on the code from Node's net documentation, might look like this. The single error handler can deal with the EADDRINUSE error each time it arises:

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

这篇关于节点httpServer EADDRINUSE和下一个端口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆