2010-11-18 17 views
2

随着NIO的出现,大多数套接字类型都可以通过SelectableChannel实现“可选择”。不幸的是,DatagramChannel在java 7之前不支持多播。多播在以前版本中通过MulticastSocket类支持。可选组播套接字(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); 
} 

的问题是如何实现receive_nonblocking不NIO 2.我不需要切换机构,但不知道是否有一些方法可以让我做一个非阻塞读取(S)或以其他方式检测是否有待处理的事情。

我已经读过要使用选择器,通道必须直接在new DatagramChannel()中创建,而不是在套接字创建后获取通道。所以如果没错,就不能使用socket.getChannel()创建一个选择器柱套接字创建。

有没有办法做到这一点,不涉及JNI或定时器,在Java 7之前?

回答

1

只需设置一个非常短的读取超时时间,并捕获SocketTimeoutException,它将在过期时抛出,并突破读取循环。

+0

谢谢,我没有意识到SO_TIMEOUT是适用的。曾经在unix io​​ctl()上寻找过非阻塞设置。 – 2010-11-20 13:28:35