如何找到可用的端口?
2022-08-31 05:58:40
我想启动一个侦听端口的服务器。我可以显式指定端口,它可以正常工作。但我想以自动方式找到一个端口。在这方面,我有两个问题。
我应该在哪个端口号范围内搜索?(我使用了端口12345,12346和12347,这很好)。
如何确定给定端口是否未被其他软件占用?
我想启动一个侦听端口的服务器。我可以显式指定端口,它可以正常工作。但我想以自动方式找到一个端口。在这方面,我有两个问题。
我应该在哪个端口号范围内搜索?(我使用了端口12345,12346和12347,这很好)。
如何确定给定端口是否未被其他软件占用?
如果您不介意使用的端口,请为ServerSocket构造函数指定一个端口0,它将侦听任何空闲端口。
ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());
如果要使用一组特定的端口,那么最简单的方法可能是循环访问它们,直到一个端口正常工作。像这样:
public ServerSocket create(int[] ports) throws IOException {
for (int port : ports) {
try {
return new ServerSocket(port);
} catch (IOException ex) {
continue; // try next port
}
}
// if the program gets here, no port in the range was found
throw new IOException("no free port found");
}
可以这样使用:
try {
ServerSocket s = create(new int[] { 3843, 4584, 4843 });
System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
System.err.println("no available ports");
}
如果将 0 作为端口号传递给 ServerSocket 的构造函数,它将为您分配一个端口。