2013-07-18 5 views
4

사용에 소켓과 ServerSocket의 차이는, 우리는 소켓을 만들 자바 서버 측에서 포트

Socket server = serverSocket.accept(); 

를 사용합니다. 소켓이 생성 된 후에는 소켓의 입출력 스트림을 처리하기위한 새로운 스레드를 생성 할 수 있습니다. 따라서 같은 포트에서 수신 대기하고 새로운 연결 요청이 들어 오면 새로운 소켓을 만들 수 있습니다. 이미 특정 포트에서 ServerSocket을 만들었으므로 물론 그 포트에서 다른 ServerSocket을 다시 만들 수 없습니다.

제 생각에 서버 측에서 하나의 포트 아래에 여러 개의 소켓을 만들 수 있다고 결론을 내릴 수 있습니까? 우리가 소켓을 만들 때

사실은 내 질문에, 클라이언트 측에서, 우리는 우리가 사용할 로컬 포트를 지정할 수있다 (어떤 웹 서버와 유사 않습니다). 해당 로컬 포트에서 클라이언트 소켓을 성공적으로 생성 한 후에 다른 클라이언트 소켓에 해당 포트를 재사용 할 수 있습니까? 이 포트는 소켓이 닫힐 때까지 (또는 포트가 닫힐 때까지) 소켓에 영구적으로 바인딩됩니까? 클라이언트 측에서 "Listening"개념이 없으므로 ServerSocket과 동일한 작업을 수행 할 수 있습니까 (ServerSocket이 하나의 포트 아래에 다중 소켓을 만들 수 있음을 참조하십시오)?

ServerSocket을 클라이언트 소켓과 비교하기 때문에 클라이언트 쪽에서 포트와 소켓을 처리하는 방법이 심각하게 혼동됩니다.

올바른 방향으로 나를 가리 키십시오. 제 생각이 어떻게 든 잘못되었다는 것을 알고 있습니다. 매우 감사합니다.

답변

3

제 생각에 서버 측에서 하나의 포트 아래에 여러 개의 소켓을 만들 수 있다고 결론 내릴 수 있습니까? (웹 서버와 유사)

용어에 혼란을 느낍니다. ServerSocket.accept()연결을 받아들이고 Socket 엔드 포인트를 감싼다. 끝점의 정의는 ServerSocket과 같으므로 RFC 793과 같으며 따라서 Socket도 마찬가지입니다.

실제로 클라이언트 측에서는 소켓을 만들 때 우리가 사용할 로컬 포트를 지정할 수 있습니다.

우리는 할 수 있지만 거의 그렇게하지는 않습니다.

로컬 포트에서 클라이언트 소켓을 성공적으로 만들었 으면 다른 클라이언트 소켓에 해당 포트를 다시 사용할 수 있습니까?

해당 포트는 소켓이 닫힐 때까지 (또는 포트가 닫힐 때까지) 소켓에 영구적으로 바인딩됩니까?

예, 그렇지 않은 경우, 소켓이 포트에 바인딩됩니다.

클라이언트 측에서 "듣기"개념이 없으므로 ServerSocket과 동일한 작업을 수행 할 수 있습니까 (ServerSocket이 하나의 포트 아래에 다중 소켓을 만들 수 있음을 참조하십시오)?

당신은 정보의 2 쌍의 배열로 소켓 상상한다

+0

안녕하세요, 거의 다 얻은 것 같습니다. 나는 유효한 소켓을 만들기 위해서 유일한 (local_address, local_port, remote_address, remote_port) 쌍이 필요하다는 것을 알고있다. 예를 들어, 포트 400에서 클라이언트 소켓을 만들고 IP 123에 연결합니다.이 연결이 종료되기 전에 동일한 포트에서 400이라는 다른 클라이언트 소켓을 만들고 IP 456에 연결합니다. 두 번째 클라이언트 소켓 수락 되니? – GMsoF

+0

TCP/IP의 경우, 아니오. 한 번에 하나의 응용 프로그램 만 단일 포트에서 수신 할 수 있습니다. 이제 2 개의 네트워크 카드가 있다면 하나의 응용 프로그램이 첫 번째 IP에서 청취하고 두 번째 응용 프로그램이 두 번째 IP에서 동일한 포트 번호를 사용하도록 할 수 있습니다. 유효한 예제는 IP 123.0.0.1에있는 두 개의 클라이언트가 포트 4000을 통해 동시에 4001을 포트 80의 서버 IP 123.0.0.2에 연결할 수 있습니다. 둘 다 서버에서 80에 연결되지만 클라이언트 측 포트의 차이점은 연결. UDP (멀티 캐스트)의 경우 여러 응용 프로그램이 동일한 포트에 가입 할 수 있지만 다른 이야기가 있습니다. – sunrize920

+1

[다른 클라이언트 소켓을 만들 수 없습니다. 같은 항구에 묶여있다 '. 이론적으로 RFC는 다른 타겟에 연결될 수 있도록 허용하지만, 실제로는 bind()가 connect()에 우선하여 커널이 허용하지 않도록합니다. – EJP

3

ServerSocket은 단순히 들어오는 연결을위한 Socket 공장으로 볼 수있다. 들어오는 모든 클라이언트 연결에 대해 ServerSocket.accept() 메서드는 새로운 Socket을 반환하여 그 클라이언트와 통신합니다.

다른 말로하면, 하나의 ServerSocket에는 여러 개의 연결 (OS에 의해서만 제한됨)이 가능하며 각 클라이언트 연결에는 동일한 서버 측 TCP 포트를 사용하여 통신 할 별도의 Socket이 전달됩니다.

+0

안녕하세요. 거의 다 얻은 것 같습니다. 나는 유효한 소켓을 만들기 위해서 유일한 (local_address, local_port, remote_address, remote_port) 쌍이 필요하다는 것을 알고있다. 예를 들어, 포트 400에서 클라이언트 소켓을 만들고 IP 123에 연결합니다.이 연결이 종료되기 전에 동일한 포트에서 400이라는 다른 클라이언트 소켓을 만들고 IP 456에 연결합니다. 두 번째 클라이언트 소켓 수락 되니? – GMsoF

1

번호 :

  • {셀프 포트, 자체 번지 기능}
  • {신지 포트, 신지 번지 기능}

따라서 하나의 서버에는 {Dest, Dest Addr}가 다른 많은 연결이 연결되어있을 수 있습니다.

example: Server port 10000 addr 10.0.0.1 

Socket 1: 

- {10000,10.0.0.1} 
- {10001,10.0.0.2} 

Socket 2: 

- {10000,10.0.0.1} 
- {10002,10.0.0.1} - address may seem the same but as a whole its a 
    different destination 

희망이 도움이됩니다.

관련 문제