我想启动一个侦听端口的服务器。我可以显式地指定端口,它工作。但我想以自动的方式找到一个端口。在这方面,我有两个问题。
我应该在哪个范围内搜索端口号?(我使用的端口是12345、12346和12347,没有问题)。 我如何知道给定的端口是否被其他软件占用?
我想启动一个侦听端口的服务器。我可以显式地指定端口,它工作。但我想以自动的方式找到一个端口。在这方面,我有两个问题。
我应该在哪个范围内搜索端口号?(我使用的端口是12345、12346和12347,没有问题)。 我如何知道给定的端口是否被其他软件占用?
当前回答
使用'ServerSocket'类,我们可以确定给定的端口是正在使用还是空闲。ServerSocket提供了一个以整数(即端口号)为参数的构造函数 参数并初始化端口上的服务器套接字。如果ServerSocket抛出任何IO异常,那么我们可以假设这个端口已经被使用。
下面的代码片段用于获取所有可用端口。
for (int port = 1; port < 65535; port++) {
try {
ServerSocket socket = new ServerSocket(port);
socket.close();
availablePorts.add(port);
} catch (IOException e) {
}
}
参考链接。
其他回答
如果您使用Spring,您可以尝试http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
这可能对你没有太大帮助,但在我的(Ubuntu)机器上,我有一个文件/etc/services,其中至少给出了一些应用程序使用/保留的端口。这些是这些应用的标准端口。
不能保证这些端口正在运行,只是这些应用程序使用的默认端口(所以如果可能的话,你不应该使用它们)。
定义了500多个端口,大约一半是UDP,一半是TCP。
这些文件是使用IANA的信息制作的,请参见IANA指定的端口号。
如果您正在使用Spring,那么由Michail Nikolaev提供的答案是最简单、最干净的,IMO应该给予好评。 为了方便起见,我将使用springframework SocketUtils.findAvailableTcpPort()方法添加一个内联示例:
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
就这么简单,只有一行:)。当然,Utils类提供了许多其他有趣的方法,我建议看看文档。
使用'ServerSocket'类,我们可以确定给定的端口是正在使用还是空闲。ServerSocket提供了一个以整数(即端口号)为参数的构造函数 参数并初始化端口上的服务器套接字。如果ServerSocket抛出任何IO异常,那么我们可以假设这个端口已经被使用。
下面的代码片段用于获取所有可用端口。
for (int port = 1; port < 65535; port++) {
try {
ServerSocket socket = new ServerSocket(port);
socket.close();
availablePorts.add(port);
} catch (IOException e) {
}
}
参考链接。
如果不介意使用的端口,可以向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");
}