随着NIO的出现,大多数套接字类型都可以通过SelectableChannel实现“选择”。不幸的是,DatagramChannel在java 7之前不支持多播。在以前的版本中,{/ 1}}类支持多播 。
我想要某种方式能够检测到多播数据报套接字上有未决消息(即可读)消息。我想阅读,直到在即时时间窗口内没有剩余的数据报。收到所有待处理的消息后,想要调用回调,但不是单独或在读取所有待处理消息之前。
使这更简单,让我们假设一个套接字。在伪代码中:
MulticastSocket
问题是如何在没有NIO 2的情况下实现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
一样直接创建通道,而不是在创建套接字后获取通道。因此,如果正确,则无法使用new DatagramChannel()
创建选择器后套接字创建。
有没有办法做到这一点,不涉及JNI或计时器,在java 7之前?
答案 0 :(得分:1)
只需设置一个非常短的读取超时,并捕获SocketTimeoutException,它将在它到期时抛出,并突破读取循环。