如何在Java中查找可用端口? - Baeldung


在本快速教程中,我们将研究如何检查特定的端口状态以及如何使用自动分配的端口状态。我们将研究如何使用普通的Java和Spring框架完成此操作。我们还将研究其他一些服务器实现,例如嵌入式Tomcat和Jetty。
 
纯Java

try (ServerSocket serverSocket = new ServerSocket(0)) {
    assertThat(serverSocket).isNotNull();
    assertThat(serverSocket.getLocalPort()).isGreaterThan(0);
} catch (IOException e) {
    fail("Port is not available");
}

 
Spring
Spring框架包含一个SocketUtils类,我们可以使用它来找到可用的空闲端口。它的内部实现使用ServerSocket类,如前面的示例所示:
int port = SocketUtils.findAvailableTcpPort();
try (ServerSocket serverSocket = new ServerSocket(port)) {
    assertThat(serverSocket).isNotNull();
    assertThat(serverSocket.getLocalPort()).isEqualTo(port);
} catch (IOException e) {
    fail("Port is not available");
}

 
Jetty
Server jettyServer = new Server();
ServerConnector serverConnector = new ServerConnector(jettyServer);
jettyServer.addConnector(serverConnector);
try {
    jettyServer.start();
    assertThat(serverConnector.getLocalPort()).isGreaterThan(0);
} catch (Exception e) {
    fail("Failed to start Jetty server");
} finally {
    jettyServer.stop();
    jettyServer.destroy();
}

 
Tomcat
Tomcat是另一种流行的Java嵌入式服务器,其工作方式略有不同。我们可以通过Tomcat类的setPort方法指定一个显式端口号。如果我们提供的端口号为零,则Tomcat将自动分配一个空闲端口。但是,如果我们未设置任何端口号,则Tomcat将使用其默认端口8080。请注意,默认Tomcat端口可能被其他应用程序占用:
Tomcat tomcatServer = new Tomcat();
tomcatServer.setPort(0);
try {
    tomcatServer.start();
    assertThat(tomcatServer.getConnector().getLocalPort()).isGreaterThan(0);
} catch (LifecycleException e) {
    fail("Failed to start Tomcat server");
} finally {
    tomcatServer.stop();
    tomcatServer.destroy();
}