2012-06-14 2 views
0

Java NIO를 처음 사용했습니다.UDP 서버를 만드는 방법은?

나는 루프에서 반복적으로 서버 (다른 IP/포트)를 쿼리하는 자바 프로그램을 가지고있다. 하지만 이제는 루프 대신에 모든 패킷을 한 번에 보내고 응답 패킷에 수신 된 데이터를 저장하려고합니다.

쿼리는 단 하나의 회신 패킷으로 구성되며 더 이상의 통신은 필요하지 않습니다.

그것을 할이 방법입니다 -> ()는 패킷을 수신 데이터 그램 채널, 이 .send를 통해 모든 패킷을 보내 확인하고 새로운 처리 스레드 및 패킷 데이터를 저장하기 시작합니다.

아마 서버 수가 400을 초과 할 수 있습니다. 400 개의 스레드 또는 400 개의 데이터 그램 채널을 만드는 것이 더 좋습니까 ??? 또한 NIO 대신 비동기 패키지를 사용해야합니다.

Netty 등으로 더 쉬울까요?

+0

나는 먼저 일반 NIO가 작동하도록 할 것입니다. TCP는 신뢰할 만하지만 UDP는 그렇지 않습니다. 일부 패킷이 도착하지 않을 수도 있다는 사실을 허용해야합니다. 400 TCP 연결의 경우 다른 이유가없는 한 한 스레드를 계속 사용합니다. –

+0

서버는 UDP에만 응답합니다. 잃어버린 패킷은 문제가되지 않습니다. – User1234

답변

0

나는 NIO를 조언 할만큼 익숙하지 않지만 응답 처리에 관해서는 스레드 풀과 채널 풀을 더 잘 사용한다.

편집 - 더 설명

당신은 서버가 응답되는 포트에서 수신 대기 단지 스레드를해야한다. 응답을 받으면 "처리 작업"을 작업 대기열에 제출하십시오. 다음 사용 가능한 스레드가 해당 작업을 가져 와서 처리합니다.

따라서 사용 가능한 스레드보다 많은 응답 (= 작업)이 있으면 작업이 대기열에서 대기합니다. Java는 java.util.concurrent 패키지 아래에서 멋진 스레드 풀 지원을 제공합니다. 이러한 제한은 물론 구성 가능합니다.

기본적으로 listner 스레드는 핸들 - 태스크를 작성하고 큐에 넣는 최소한의 조작을 수행합니다. 짧은 기간 동안 답장이 누락 될까봐 두려워하면 더 많은 청취자 스레드를 구성해야합니다 ...하지만 실제 문제는 의심 스럽습니다.

+0

내가 50 개의 스레드를 가진 스레드 풀을 만들고 수신 된 응답 패킷이 51 인 경우. 여분의 패킷은 어떻게됩니까? – User1234

+0

@ 솔루션 왜 한 스레드가 51 패키지를받을 수있을 때 스레드가 50 개입니까? –

+0

한 스레드가 이전 패킷을 처리하고있는 동안 패킷이 수신되면 어떤 일이 발생합니까? – User1234

0

UDP를 사용하려는 경우 서버 당 하나의 스레드와 모든 포트에 대해 하나의 스레드를 사용할 수 있습니다. 다른 메시지 유형에 대해 포트 2 개를 사용할 수 있습니다.

하나의 멀티 캐스트 & 포트를 사용하는 경우 모든 청취자는 모든 응용 프로그램의 모든 패킷을 해당 IP & 포트로 수신합니다.

+0

거기에 Java에서 여러 개의 동시 패킷을 처리하는 기존의 라이브러리/오픈 소스 코드가 있습니다. 모든 샘플 코드도 수행합니다. 감사합니다. – User1234

+0

몇 개의 네트워크 어댑터에 목록을 만드시겠습니까? 1GB 연결이 있고 패킷의 크기가 1KB 인 경우 10 마이크로 초 정도 떨어져 있지 않습니다. 당신이 거의 100K/s를 보내지 않는 한 그들은 거의 무작위로 보내지는 것처럼 보일 것입니다. –

+0

.receive() 메서드는 데이터 그램 채널에서 얼마나 작동합니까? 예를 들어. .send()를 사용하여 패킷을 보내고 중단 점을 넣으면 ... 잠시 기다려주세요 ... .receive()를 계속 사용할 수 있습니다. 감사합니다. – User1234

관련 문제