如何找到一个可用的端口?

我想启动一个监听端口的服务器。 我可以明确指定端口并且它可以工作。 但我想自动找到一个端口。 在这方面我有两个问题。

  • 我应该搜索哪些端口号码范围? (我用端口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的构造函数,它将为您分配一个端口。


    从Java 1.7开始,你可以使用try-with-resources这样的资源:

      private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException {
        try (
            ServerSocket socket = new ServerSocket(0);
        ) {
          return socket.getLocalPort();
    
        }
      }
    

    如果您需要在特定接口上查找打开的端口,请检查ServerSocket文档以了解其他构造函数。

    警告:使用此方法返回的端口号的任何代码都会受到竞争条件的影响 - 在关闭ServerSocket实例后,不同的进程/线程可能会立即绑定到同一端口。

    链接地址: http://www.djcxy.com/p/30291.html

    上一篇: How to find an available port?

    下一篇: Can two applications listen to the same port?