我想启动一个侦听端口的服务器。我可以显式地指定端口,它工作。但我想以自动的方式找到一个端口。在这方面,我有两个问题。
我应该在哪个范围内搜索端口号?(我使用的端口是12345、12346和12347,没有问题)。 我如何知道给定的端口是否被其他软件占用?
我想启动一个侦听端口的服务器。我可以显式地指定端口,它工作。但我想以自动的方式找到一个端口。在这方面,我有两个问题。
我应该在哪个范围内搜索端口号?(我使用的端口是12345、12346和12347,没有问题)。 我如何知道给定的端口是否被其他软件占用?
当前回答
根据维基百科,如果你不需要一个“众所周知”的端口,你应该使用端口49152到65535。
判断一个端口是否正在使用的唯一方法是尝试打开它。
其他回答
我最近发布了一个小型库,专门用于测试。 Maven依赖关系是:
<dependency>
<groupId>me.alexpanov</groupId>
<artifactId>free-port-finder</artifactId>
<version>1.0</version>
</dependency>
安装完成后,可通过以下方式获取空闲端口号:
int port = FreePortFinder.findFreeLocalPort();
如果你正在使用Spring框架,最直接的方法是:
private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort();
你也可以设置一个可接受的范围,它会在这个范围内搜索:
private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort(9090, 10090);
这是一种方便的方法,它抽象了复杂性,但在内部与本线程中的许多其他答案相似。
这适用于我在Java 6上的工作
ServerSocket serverSocket = new ServerSocket(0);
System.out.println("listening on port " + serverSocket.getLocalPort());
欧洲经济区ServerSocket:
创建绑定到指定端口的服务器套接字。端口为0在任何空闲端口上创建套接字。
如果你想使用ServerSocket创建你自己的服务器,你可以让它为你选择一个空闲端口:
ServerSocket serverSocket = new ServerSocket(0);
int port = serverSocket.getLocalPort();
其他服务器实现通常也有类似的支持。例如,Jetty选择一个空闲端口,除非你显式地设置它:
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
// don't call: connector.setPort(port);
server.addConnector(connector);
server.start();
int port = connector.getLocalPort();