Java 可选多播套接字(1.7之前版本)

Java 可选多播套接字(1.7之前版本),java,multicast,Java,Multicast,随着NIO的出现,大多数套接字类型可以通过SelectableChannel实现“可选”。不幸的是,在Java7之前,DatagramChannel不支持多播。以前的版本通过MulticastSocket类支持多播 我希望有某种方法能够检测多播数据报套接字上是否存在挂起的消息(即可读的)消息。我想一直读到即时时间窗口内没有剩余的数据报为止。收到所有挂起的消息后,希望调用回调,但不是单独调用,也不是在读取所有挂起的消息之前调用 让这更简单,让我们假设一个套接字。在伪代码中: List<Msg

随着NIO的出现,大多数套接字类型可以通过SelectableChannel实现“可选”。不幸的是,在Java7之前,DatagramChannel不支持多播。以前的版本通过
MulticastSocket
类支持多播

我希望有某种方法能够检测多播数据报套接字上是否存在挂起的消息(即可读的)消息。我想一直读到即时时间窗口内没有剩余的数据报为止。收到所有挂起的消息后,希望调用回调,但不是单独调用,也不是在读取所有挂起的消息之前调用

让这更简单,让我们假设一个套接字。在伪代码中:

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);
}
收到的列表=新的ArrayList while(true) { 已收到。清除(); //初始阻塞接收 数据=接收阻塞(套接字、数据报) received.add(新消息(数据)); //清除剩余的消息 for(布尔接收=真;接收;) { //非阻塞 if(接收非阻塞(套接字、数据报)) received.add(新消息(数据报)); 其他的 接收=假; } 回拨(已收到); } 问题是如何在没有NIO 2的情况下实现
receive\u nonblocking
。我不需要选择器机制,但想知道是否有某种方法可以执行非阻塞读取或以其他方式检测是否存在挂起的内容

我已经读到,要使用选择器,必须像在
new DatagramChannel()
中那样直接创建通道,而不是在创建套接字后获取通道。因此,如果我是正确的,则无法使用
socket.getChannel()
创建选择器后套接字创建


在java 7之前,有没有不涉及JNI或计时器的方法可以做到这一点?

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

谢谢,我没有意识到SO_timeout是适用的。已在unix ioctl()上查找类似的非阻塞设置。