Socket 및 ServerSocket 포트 사용법에 대해 혼란스러워합니다.클라이언트를 수락 한 후 Java ServerSocket이 동일한 로컬 포트에 바인딩 된 새 소켓을 얻는 방법은 무엇입니까?
소켓은 무엇인가 : Oracle's java tutorial about sockets는 다음 말한다?
일반적으로 서버는 특정 컴퓨터에서 실행되며 특정 포트 번호에 바인딩 된 소켓이 있습니다. 서버는 클라이언트가 연결 요청을하기 위해 소켓을 청취하기 만하면됩니다. 클라이언트 측 : 클라이언트는 서버가 실행중인 시스템의 호스트 이름과 서버가 수신 대기중인 포트 번호를 알고 있습니다. 연결 요청을하기 위해 클라이언트는 서버의 시스템과 포트에서 서버와의 랑데뷰를 시도합니다. 클라이언트는 서버에 자신을 식별 시켜서이 연결 중에 사용할 로컬 포트 번호에 바인드해야합니다. 일반적으로 시스템에 의해 할당됩니다.
모든 것이 잘되면 서버는 연결을 수락합니다. 수락시 서버는 동일한 로컬 포트 에 바인드 된 새 소켓을 가져오고 클라이언트의 주소와 포트로 설정된 원격 끝점을 갖습니다. 연결된 클라이언트 의 필요를 돌보는 동안 연결 요청에 대해 원래 소켓을 계속 수신 할 수 있도록 새 소켓이 필요합니다.
클라이언트 쪽에서 연결이 수락되면 소켓이 성공적으로 만들어지고 클라이언트는 소켓을 사용하여 서버와 통신 할 수 있습니다. 이제 클라이언트와 서버는 소켓에 쓰거나 소켓에서 읽음으로써 통신 할 수 있습니다.
테스트를 위해 다음 코드를 시도했습니다. 그러나 그것은 예외를 던집니다.
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
// This prints 8080
System.out.println("Local port of accepted socket : " + socket.getLocalPort());
// But this throws java.net.BindException: Address already in use: JVM_Bind
Socket myClientSocket = new Socket("www.google.com", 80, null, 8080);
} catch (Exception e) {
e.printStackTrace();
}
제 질문은 분명합니다. serverSocket.accept()
에서 반환 된 소켓은 동일한 로컬 포트 (8080
)를 사용할 수 있지만 왜 내가 만든 소켓을 사용할 수 없습니까?
그들이 설계 한 방식이기 때문입니다. 인용하고있는 것에 대해 명확히 기재하십시오. – EJP