2012-07-27 4 views
0

채팅 응용 프로그램을 구현하려고하는데 피어 간의 메시징 교환을 위해 TCP 또는 UDP를 사용하도록 설계해야합니다. TCP를 사용하고 싶지만 다음과 같은 문제가 있습니다.TCP로 다중 스레드 처리

문제 시나리오 : 피어 A는 잘 알려진 포트 (예 : 5555)에서 수신 대기하고 있습니다. 피어 B가 피어 A에게 메시지를 보내려고하면 피어 A는 해당 포트 5555에 연결합니다. 피어 A는 연결을 허용하고 피어 B와의 통신을 처리하기 위해 새 스레드를 시작하므로 다른 피어 (피어 C)는 다음을 수행 할 수 있습니다. 피어 A의 5555 포트에 연결합니다. 이제 문제는 요청/응답 프로토콜이 아니기 때문에 피어 A가 어떤 이유로 피어 B에 응답하지 않으면 B가 보낸 후속 메시지가 피어 A의 포트 5555에 전달된다는 사실을 혼란스럽게 생각합니까? 피어 A는 수신 된 각 메시지에 대해 별도의 스레드를 생성합니다.

UDP를 사용하면이 문제가 해결 될 것이므로 각 피어와 통신하기 위해 별도의 스레드를 만들어야하며 모든 사람들이 잘 알려진 동일한 포트로 메시지를 보낼 수 있습니다. 하지만 메시지를 전달하기 위해 TCP를 사용하고 싶습니다. 이 문제를 처리하고 하나의 피어와의 통신을 위해 하나의 스레드 만 사용하는 좋은 방법은 무엇입니까?

답변

2

당신이 말한 문제는 TCP가 '연결형'프로토콜이기 때문에 발생하지 않습니다. 기본적으로 두 피어가 다른 일이 일어나기 전에 통신을 협상해야한다는 것을 의미합니다. 그런 다음 TCP는 데이터 패킷의 순서를 제어하여 대상에 올바른 순서로 도착하도록합니다. BTW, TCP는 전송 제어 프로토콜 (Transmission Control Protocol)의 약자이므로 설명하는 내용이 발생하지 않도록 많은 강조를합니다. UDP의 경우는 그렇지 않습니다.

ServerSocket이 클라이언트 Socket에서 연결을 수락하면 협상이 완료되고 TCP 스트림이 해당 통신 전용으로 사용됩니다.

새 방법을 만드는 유일한 방법은 클라이언트가 새 소켓을 통해 다른 연결을 보내는 경우입니다.

그러나 자신을 설득하는 가장 좋은 방법은 앱에 로깅을 추가하고 직접 시도하는 것입니다.

+0

+1. 또한 serverSocket은 미리 정의 된 포트에서 들어오는 연결을 수신 대기해야합니다. 피어 간의 모든 추가 통신은 무작위 (그러나 사전에 정해진) 포트에서 수행됩니다. – Shark

+0

@ Shark No. 서버 측에서는 수신 소켓이 수신 대기 소켓과 동일한 로컬 포트를 사용합니다. 사전 준비도 필요하지 않습니다. ServerSocket이 무엇을해야하는지에 대한 부분은 이해할 수 없습니다. 확실히 다른 것을 할 수 없기 때문입니다. – EJP

2

또는 서버, 소켓 및 이 (가) 소켓으로 연결되는 것을 혼동스럽게합니다.

청취 측에서 TCP 연결을 수락하면 두 당사자간에 완전히 새로운 양방향 소켓이있어서 데이터를 교환 할 수 있습니다. 청취 소켓의 유일한 목적은 연결을 허용하는 것이며 응용 프로그램 데이터는 이러한 연결을 통과하지 않습니다.

새 연결 소켓을 스레드에 넘길 수는 있지만, 반드시 하나의 스레드에서 많은 비 블로킹 소켓을 처리 할 수 ​​있습니다. Java NIO 패키지가 정확하게 작성되었다고 생각합니다.