可选组播插座(1.7之前)

时间:2010-11-18 23:02:25

标签: java multicast

随着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之前?

1 个答案:

答案 0 :(得分:1)

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