在nodejs中,如何检查端口是否正在侦听或正在使用

roc*_*cky 10 sockets node.js

我将在这里非常具体,希望了解这一点的人可以编辑以重新描述一般情况.

目前,当您运行"node debug"时,它会生成一个进程以侦听端口5858.然后在父进程中,尝试连接到该端口.

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

特别是您看到的消息是:

 $ node debug example/gcd.js 3 5
< debugger listening on port 5858 >
connecting...
Run Code Online (Sandbox Code Playgroud)

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

编辑:已接受的解决方案现在在trepanjs中.

另请参阅节点JS - 如果使用Einaros WS套接字模块打开套接字,您如何判断?

roc*_*cky 14

以下是我使用的变体:

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.listen(port, '127.0.0.1');
    server.on('error', function (e) {
	callback(true);
    });
    server.on('listening', function (e) {
	server.close();
	callback(false);
    });
};

portInUse(5858, function(returnValue) {
    console.log(returnValue);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说总是返回 false,网络已安装并且可以通过 telnet 访问端口。我究竟做错了什么 ? (2认同)

Tro*_*ott 5

您应该能够使用该node-netstat模块来检测正在侦听的端口。不幸的是,它似乎仅支持Windows和Linux。但是,要使其支持OS X,所需的更改看起来不会太大。更新:现在支持OS X ... er macOS ... er,无论他们现在叫什么。

  • 谢谢你的插头。我是 `node-netstat` 的作者,只是想提一下它有 OS X 支持。 (3认同)