2010-11-18 3 views
2

NIO의 출현으로 대부분의 소켓 유형은 SelectableChannel 구현을 통해 "선택 가능"할 수 있습니다. 아쉽게도 DatagramChannel은 Java 7 이전의 멀티 캐스트를 지원하지 않습니다. 멀티 캐스트 MulticastSocket 클래스를 통해 이전 버전에서 지원되는입니다.Selectable Multicast socket (pre 1.7)

멀티 캐스트 데이터 그램 소켓에 보류중인 메시지 (즉 읽을 수있는 메시지)가 있음을 감지 할 수있는 방법이 필요합니다. 나는 즉시 시간 창안에 남아있는 데이터 그램이 없을 때까지 읽고 싶다. 보류중인 모든 메시지를 수신 한 후 콜백을 호출하려고하지만 개별적으로 또는 모든 보류중인 메시지를 읽지 않기 전에.

이렇게 간단하게 만들면 하나의 소켓을 가정 해 봅시다. 의사 코드에서 :

List<Msg> received = new ArrayList<Msg> 
while (true) 
{ 
    received.clear(); 
    // initial blocking receive 
    data = receive_blocking (socket, datagram) 
    received.add (new Msg(data)); 

    // flush out remaining messages 
    for (boolean receiving = true ; receiving ;) 
    { 
     // non-blocking 
     if (receive_nonblocking (socket, datagram)) 
      received.add (new Msg(datagram)); 
     else 
      receiving = false; 
    } 

    callback (received); 
} 

질문 나는 선택기 메커니즘이 필요하지 않습니다 NIO 2.없이 receive_nonblocking을 구현,하지만 난 비 차단 읽기 (들)을 수행 할 수있는 방법이 있는지 궁금하거나하는 방법입니다 보류중인 것이 있는지 여부를 감지합니다.

내가 셀렉터를 사용하는 것을 읽었으므로 소켓 생성 후 채널을 얻는 대신 new DatagramChannel()처럼 직접 채널을 만들어야합니다. 따라서 올바른 경우 socket.getChannel()을 사용하여 선택기 포스트 소켓 생성을 만들 수 없습니다.

JNI 또는 타이머 (프리 자바 7)를 포함하지 않는 방법이 있습니까?

답변

1

매우 짧은 읽기 시간 제한을 설정하고 만료 될 때 throw되고 독서 루프에서 벗어나는 SocketTimeoutException을 잡습니다.

+0

감사합니다. SO_TIMEOUT이 적용 가능하다는 것을 알지 못했습니다. unix ioctl()에서 비 차단 설정을 찾아야했습니다. –