source

사용 가능한 포트를 찾는 방법

factcode 2022. 8. 28. 09:31
반응형

사용 가능한 포트를 찾는 방법

포트를 리슨하는 서버를 기동하고 싶다.포토를 명시적으로 지정할 수 있어 동작합니다.하지만 저는 자동으로 항구를 찾고 싶습니다.이 점에서 나는 두 가지 질문이 있다.

  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부터는 다음과 같은 리소스를 사용할 수 있습니다.

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

    }
  }

특정 인터페이스에서 열려 있는 포트를 찾아야 할 경우 대체 컨스트럭터의 ServerSocket 문서를 참조하십시오.

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

위키피디아에 따르면 포트를 사용해야 합니다.49152로.65535'잘 알려진' 포트가 필요 없는 경우.

AFIK 는, 포토가 어디에서 사용되고 있는지를 판별하는 유일한 방법입니다.

범위 내에서 사용해야 하는 경우:

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;
    }
}

Spring을 사용하는 경우 http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--을 사용해 보십시오.

Eclipse SDK에는 원하는 작업을 수행하는 SocketUtil 클래스가 포함되어 있습니다.git 소스코드에 대해 알아보실 수 있습니다.

Java 6에서 이 기능을 사용할 수 있습니다.

    ServerSocket serverSocket = new ServerSocket(0);
    System.out.println("listening on port " + serverSocket.getLocalPort());

저는 최근 테스트를 염두에 두고 작은 도서관을 출시했습니다.Maven 의존관계:

<dependency>
    <groupId>me.alexpanov</groupId>
    <artifactId>free-port-finder</artifactId>
    <version>1.0</version>
</dependency>

인스톨이 완료되면, 다음의 방법으로 빈 포토 번호를 취득할 수 있습니다.

int port = FreePortFinder.findFreeLocalPort();

Server Socket 참조:

지정된 포트에 바인드된 서버 소켓을 만듭니다.포트 0은 임의의 빈 포트에 소켓을 만듭니다.

서버가 기동했을 경우는, 그 소켓은 사용되지 않았습니다.

편집

예를 들어 다음과 같습니다.

ServerSocket s = null ;

try { 
    s = new ServerSocket( 0 ); 
} catch( IOException ioe ){
   for( int i = START; i < END ; i++ ) try {
        s = new ServerSocket( i );
    } catch( IOException ioe ){}
}
// At this point if s is null we are helpless
if( s == null ) {
    throw new IOException(
       Strings.format("Unable to open server in port range(%d-%d)",START,END));
}

를 사용하여 독자적인 서버를 작성하는 경우ServerSocket 빈 포토를 만으로 할 수 「」).

  ServerSocket serverSocket = new ServerSocket(0);
  int port = serverSocket.getLocalPort();

다른 서버의 실장에서도, 일반적으로 같은 서포트가 있습니다.를 들어 Jetty는 명시적으로 설정하지 않는 한 빈 포트를 선택합니다.

  Server server = new Server();
  ServerConnector connector = new ServerConnector(server);
  // don't call: connector.setPort(port);
  server.addConnector(connector);
  server.start();
  int port = connector.getLocalPort();

Spring을 사용하는 경우 Michail Nikolaev가 제공하는 답변이 가장 간단하고 깔끔하며 IMO는 상향 투표해야 합니다.편의를 위해 Springframwework SocketUtils.FindAvailableTcpPort() 메서드를 사용하여 인라인 예를 추가합니다.

int randomAvailablePort = SocketUtils.findAvailableTcpPort();

이렇게 간단하게 한 줄 :)물론 Utils 클래스는 그 밖에도 많은 흥미로운 방법을 제공하므로, 문서를 보는 것이 좋습니다.

별로 도움이 되지 않을 수도 있지만, 제 (Ubuntu) 머신에는 파일 /etc/services가 있습니다.이 파일에는 적어도 일부 앱에서 사용/예약된 포트가 있습니다.이러한 앱의 표준 포트는 다음과 같습니다.

이러한 프로그램이 실행 중이라는 보장은 없으며, 이러한 앱이 사용하는 기본 포트만 사용할 수 있으므로 가능하면 사용하지 마십시오.

정의되어 있는 포토는 500개를 약간 웃돌고 있습니다.약 절반은 UDP이고 절반은 TCP입니다.

파일은 IANA에 의한 정보를 사용하여 작성됩니다.IANA 할당 포트 번호를 참조해 주세요.

스프링 프레임워크를 사용하는 경우 가장 간단한 방법은 다음과 같습니다.

private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort();

또한 허용 범위를 설정할 수 있으며, 이 범위 내에서 검색합니다.

private Integer laancNotifyPort = SocketUtils.findAvailableTcpPort(9090, 10090);

이는 복잡성을 추상화하는 편리한 방법이지만 내부적으로는 이 스레드의 다른 많은 답변과 유사합니다.

Server Socket' 클래스를 사용하여 지정된 포트가 사용 중인지 사용 중인지 여부를 식별할 수 있습니다.Server Socket은 정수(포트 번호)를 인수로 사용하여 포트 상의 서버 소켓을 초기화하는 컨스트럭터를 제공합니다.Server Socket에서 IO 예외가 발생하면 이 포트는 이미 사용 중이라고 가정할 수 있습니다.

다음 스니펫을 사용하여 사용 가능한 모든 포트를 가져옵니다.

for (int port = 1; port < 65535; port++) {
         try {
                  ServerSocket socket = new ServerSocket(port);
                  socket.close();
                  availablePorts.add(port);
         } catch (IOException e) {

         }
}

참조 링크

언급URL : https://stackoverflow.com/questions/2675362/how-to-find-an-available-port

반응형