[java] 사용 가능한 포트를 찾는 방법은 무엇입니까?

포트를 수신하는 서버를 시작하고 싶습니다. 포트를 명시 적으로 지정할 수 있으며 작동합니다. 그러나 자동 방식으로 포트를 찾고 싶습니다. 이와 관련하여 두 가지 질문이 있습니다.

  1. 어떤 포트 번호 범위에서 검색해야합니까? (포트 12345, 12346 및 12347을 사용했는데 문제가 없었습니다).

  2. 특정 포트가 다른 소프트웨어를 사용하지 않는지 어떻게 알 수 있습니까?



답변

사용 된 포트가 마음에 들지 않으면 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");
}


답변

ServerSocket의 생성자에 포트 번호로 0을 전달하면 포트가 할당됩니다.


답변

Java 1.7부터 다음과 같은 try-with-resources를 사용할 수 있습니다.

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

    }
  }

특정 인터페이스에서 열린 포트를 찾아야하는 경우 대체 생성자에 대해서는 ServerSocket 설명서를 확인하십시오 .

경고 : 이 방법으로 반환 된 포트 번호를 사용하는 코드는 경쟁 조건에 따라 달라질 수 있습니다. ServerSocket 인스턴스를 닫은 직후 다른 프로세스 / 스레드가 동일한 포트에 바인딩 될 수 있습니다.


답변

Wikipedia 에 따르면 ‘잘 알려진’포트가 필요하지 않은 경우 포트 4915265535사용해야합니다.

AFAIK 포트 사용 여부를 확인하는 유일한 방법은 포트를 열려고 시도하는 것입니다.


답변

범위 내 에서 필요한 경우 :

public int nextFreePort(int from, int to) {
    int port = randPort(from, to);
    while (true) {
        if (isLocalPortFree(port)) {
            return port;
        } else {
            port = ThreadLocalRandom.current().nextInt(from, to);
        }
    }
}

private boolean isLocalPortFree(int port) {
    try {
        new ServerSocket(port).close();
        return true;
    } catch (IOException e) {
        return false;
    }
}


답변


답변

Eclipse SDK에는 원하는 소켓 소켓 클래스가 포함되어 있습니다 . git 소스 코드를 살펴볼 수 있습니다 .