我想启动一个侦听端口的服务器。我可以显式地指定端口,它工作。但我想以自动的方式找到一个端口。在这方面,我有两个问题。

我应该在哪个范围内搜索端口号?(我使用的端口是12345、12346和12347,没有问题)。 我如何知道给定的端口是否被其他软件占用?


当前回答

如果你正在使用Spring框架,最直接的方法是:

private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort();

你也可以设置一个可接受的范围,它会在这个范围内搜索:

private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort(9090, 10090);

这是一种方便的方法,它抽象了复杂性,但在内部与本线程中的许多其他答案相似。

其他回答

如果您将0作为端口号传递给ServerSocket的构造函数,它将为您分配一个端口。

我最近发布了一个小型库,专门用于测试。 Maven依赖关系是:

<dependency>
    <groupId>me.alexpanov</groupId>
    <artifactId>free-port-finder</artifactId>
    <version>1.0</version>
</dependency>

安装完成后,可通过以下方式获取空闲端口号:

int port = FreePortFinder.findFreeLocalPort();

Eclipse SDK包含一个SocketUtil类,它可以做你想做的事情。你可以看看git的源代码。

这里有很多使用ServerSocket的答案。我检查了Micronauts实现,他们转而尝试将客户端套接字连接到本地端口,如果失败,他们说端口是开放的。对我来说,这样做的好处是他们不必冒险在测试中使用端口。

它们的代码是这样的:

    public static boolean isTcpPortAvailable(int currentPort) {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), currentPort), 20);
            return false;
        } catch (Throwable e) {
            return true;
        }
    }

参考网址:https://github.com/micronaut-projects/micronaut-core/blob/3.4.x/core/src/main/java/io/micronaut/core/io/socket/SocketUtils.java

欧洲经济区ServerSocket:

创建绑定到指定端口的服务器套接字。端口为0在任何空闲端口上创建套接字。