找到两个免费的TCP端口

leo*_*loy 6 java sockets tcp

我理解以下代码可以(可能不是非常有效)在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)

(这里有一些相关的问题在SO - 例子).

我不明白的原因是,为什么(或者是否)对这种方法的两次成功调用保证返回两个不同的端口.例如,这里假设(搜索findFreePort方法调用).

它是否正确?

Ben*_*ine 5

在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)