我理解以下代码可以(可能不是非常有效)在Java中找到一个免费的TCP端口:
public static int findFreePort() {
int port;
try {
ServerSocket socket= new ServerSocket(0);
port = socket.getLocalPort();
socket.close();
} catch (Exception e) { port = -1; }
return port;
}
Run Code Online (Sandbox Code Playgroud)
我不明白的原因是,为什么(或者是否)对这种方法的两次成功调用保证返回两个不同的端口.例如,这里假设(搜索findFreePort方法调用).
它是否正确?
在Javadoc规范中,我没有看到任何一行说两个成功的调用保证返回两个不同的端口......
由于ServerSocket已关闭,第二次调用可能会提供相同的端口.从统计上来说,这是不可能的,但我认为并非不可能.
如果打开两个ServerSocket,获取端口,然后关闭两个ServerSocket,则需要获得两个不同的端口(因为在创建第二个ServerSocket时第一个不是空闲的).
获取n个不同空闲端口的示例方法:
public int[] getFreePorts(int portNumber) throws IOException {
int[] result = new int[portNumber];
List<ServerSocket> servers = new ArrayList<ServerSocket>(portNumber);
ServerSocket tempServer = null;
for (int i=0; i<portNumber; i++) {
try {
tempServer = new ServerSocket(0);
servers.add(tempServer);
result[i] = tempServer.getLocalPort();
} finally {
for (ServerSocket server : servers) {
try {
server.close();
} catch (IOException e) {
// Continue closing servers.
}
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6570 次 |
| 最近记录: |