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)를 포함하지 않는 방법이 있습니까?
감사합니다. SO_TIMEOUT이 적용 가능하다는 것을 알지 못했습니다. unix ioctl()에서 비 차단 설정을 찾아야했습니다. –