포트를 수신하는 서버를 시작하고 싶습니다. 포트를 명시 적으로 지정할 수 있으며 작동합니다. 그러나 자동 방식으로 포트를 찾고 싶습니다. 이와 관련하여 두 가지 질문이 있습니다.
-
어떤 포트 번호 범위에서 검색해야합니까? (포트 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");
}
답변
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 에 따르면 ‘잘 알려진’포트가 필요하지 않은 경우 포트 49152
를 65535
사용해야합니다.
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;
}
}
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)