随着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之前?
谢谢,我没有意识到SO_TIMEOUT是适用的。曾经在unix ioctl()上寻找过非阻塞设置。 – 2010-11-20 13:28:35