【问题标题】:In nodejs, how do I check if a port is listening or in use在nodejs中,如何检查端口是否正在侦听或正在使用
【发布时间】:2021-06-16 17:59:20
【问题描述】:

我将在这里非常具体,希望了解这一点的人可以编辑以改写为一般情况。

当前,当您运行“节点调试”时,它会生成一个进程来侦听端口 5858。然后在父级中,尝试连接到该端口。

但是,如果您正在运行另一个“节点调试”会话,则当前“节点调试”会挂起,因为该端口正在使用中。

具体你看到的消息是:

 $ node debug example/gcd.js 3 5
< debugger listening on port 5858 >
connecting...

最好让它检测到端口正在使用中(没有连接到它可能会弄乱另一个尝试连接现有调试器的客户端)。

编辑:接受的解决方案现在位于trepan-nitrepanjs

另见Node JS - How Can You Tell If A Socket Is Already Open With The Einaros WS Socket Module?

【问题讨论】:

  • 您可以尝试在端口上侦听,看看是否收到EADDRINUSE 错误返回。
  • @robertklep 虽然这是正确的想法,但我一直在寻找具体的代码。

标签: node.js sockets


【解决方案1】:

以下是我使用的变体:

var net = require('net');

var portInUse = function(port, callback) {
    var server = net.createServer(function(socket) {
    socket.write('Echo server\r\n');
    socket.pipe(socket);
    });

    server.on('error', function (e) {
    callback(true);
    });
    server.on('listening', function (e) {
    server.close();
    callback(false);
    });

    server.listen(port, '127.0.0.1');
};

portInUse(5858, function(returnValue) {
    console.log(returnValue);
});

涉及更多一点的实际提交是https://github.com/rocky/trepanjs/commit/f219410d72aba8cd4e91f31fea92a5a09c1d78f8

【讨论】:

  • 总是为我返回 false,net 已安装并且可以通过 telnet 访问端口。我做错了什么?
【解决方案2】:

您应该能够使用node-netstat module 来检测正在侦听的端口。 不幸的是,它似乎只支持 Windows 和 Linux。但是,让它支持 OS X 所需的更改看起来并不大。 更新:它现在支持 OS X...er macOS...er 无论他们现在如何称呼它。

【讨论】:

  • 感谢插件。我是node-netstat 的作者,我只想提一下它支持 OS X。
【解决方案3】:

使用内部http模块:

const isPortFree = port =>
  new Promise(resolve => {
    const server = require('http')
      .createServer()
      .listen(port, () => {
        server.close()
        resolve(true)
      })
      .on('error', () => {
        resolve(false)
      })
  })

【讨论】:

  • 看起来这会创建或尝试创建一个新的监听端口的东西,无论多么简短。不过我写的是:“最好让它检测到端口正在使用中(没有连接到它,这可能会弄乱另一个试图连接现有调试器的客户端)。”。这也是另一个尝试建立连接以侦听端口的客户端的树。
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 2018-04-11
  • 2015-08-28
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多