상태 저장 다중 클라이언트 서버 응용 프로그램을 구현하고 네트워킹/스레드 설계에 대한 몇 가지 질문이 있습니다. 현재 직면하고있는 문제는 통신 레이어와 로직 레이어간에 메시지를 교환하는 방법입니다.Java 다중 스레드 상태 저장 서버 - 네트워킹 디자인
서버는 여러 클라이언트를 처리하며, 각 클라이언트는 여러 개의 "채널"에서 활성화 될 수 있습니다. 각 채널은 여러 단계로 구성되어 있으며 여러 클라이언트가 작동 할 수 있습니다. 여러 방이있는 채팅 프로그램과 비슷한 것으로 생각하십시오.
나는 이미 서버 측에서 메시지 수신을 구현했습니다. 각 클라이언트는 자신의 스레드를 보유하고있어 데이터를 막히고 메시지로 디코딩합니다. 지금 진행하는 방법? 저의 의견으로는, 각 채널은 자신의 상태를 쉽게 유지할 수있는이 스레드를 가져야합니다. BlockingQueue를 사용하여 수신 된 메시지를 채널 스레드와 교환 할 수 있습니다. 채널 스레드는 차단 대기열에서 새 메시지를 기다리고 있습니다.
하지만 클라이언트에게 메시지를 보내려면 어떻게해야합니까? 채널의 논리는 메시지를 처리하고 일부/일부/모든 클라이언트로 전송할 메시지를 생성합니다. 채널 스레드를 사용하여 소켓에 직접 쓰는 것이 안전합니까? 또는 다른 BlockingQueue를 사용하여 메시지를 클라이언트 처리기 스레드로 전송해야합니까? 하지만 소켓을 읽을 때까지 기다리고 있기 때문에 깨우는 방법은 무엇입니까? 아니면 클라이언트마다 별도의 송신 쓰레드를 사용해야합니까, 아니면 별도의 송신 소켓을 사용해야합니까?
BTW : 네트워크 계층에 기존 라이브러리를 사용할 수는 있지만 일반 소켓에서는 처음부터 수행하고 싶습니다.
처리가 싸고 메시지 당이라면 멀티 스레딩을 사용할 수 있을지 잘 모르겠다. 나는 원자로를 대신 사용하는 것을 고려할 것이다. 각 클라이언트 및/또는 채널에 상태가 있다는 사실은 스레드를 사용해야한다는 것을 의미하지는 않습니다. – sinelaw
@sinelaw 귀하가 NIO를 언급 한 것으로 간주합니다. 이 기사에서는 http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html NIO/IO를 비교하므로 연결 당 하나의 스레드를 사용하기로 결정했습니다 (이미 구현되어 있습니다).). 하지만 채널에 대해 다른 접근 방법을 선택할 수 있습니다 ... 실제 질문은 동일합니다 –