2

我编写了一个能够通过多播地址发送/接收消息的 java 程序。我的多播发送者代码:

public boolean multicastSender(DataTransferObject message) {

        try {

            InetAddress group = InetAddress.getByName(ip);
            MulticastSocket s = new MulticastSocket(port);
            s.joinGroup(group);

            String msg = jsh.dtoToJsonString(message);
            DatagramPacket data = new DatagramPacket(
                    msg.getBytes(), msg.length(), group, port);
            s.send(data);

            s.leaveGroup(group);
            return true;

        } catch (IOException e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return false;
        }
    }

我的多播接收器代码:

public DataTransferObject multicastReceiver() {
    try {
        InetAddress group = InetAddress.getByName(ip);
        MulticastSocket s = new MulticastSocket(port);
        s.joinGroup(group);

        byte[] buffer = new byte[1000 * 1024];
        DatagramPacket data = new DatagramPacket(buffer, buffer.length);
        String jsonData;
        DataTransferObject dto;
        while (true) {
            s.receive(data);
            jsonData = new String(buffer, 0, data.getLength());
            dto = jsh.dtoFromJson(jsonData);

            if (dto == null) {
                continue;
            } else {

                return dto;

            }
        }
    } catch (IOException e) {
        System.out.println(e.toString());
        e.printStackTrace();
        return null;
    }
} 

我的程序有 4 个并行线程,它们侦听和接收来自四个不同多播地址 (224.0.0.[1->4]) 和端口 [66601->66604] 的消息。在测试中,我同时运行两个程序来测试它们之间的通信。然而我发现有时,程序 A 向多播地址发送消息,在正确的情况下,A 也会收到它,B 也会收到。但有时,我看到 A 宣布它发送了消息,但之后,A 都没有或 B 再次收到。我在本地机器上运行测试(Mac OS 10.9 with core 2 duo)。这个问题应该是因为我的电脑还是其他原因?
非常感谢。

4

2 回答 2

0

我已经在 Windows 环境中看到过这种情况。我知道这是因为网络层与 JVM 是分开的。

这意味着一个 JVM 可以读取并处理/丢弃此消息,但其他 JVM 不会读取相同的消息,因为网络层已经将 UDP 消息传递给第一个消费者,无论有多少 JVM 订阅了相同的消息团体。这可能是也可能不是操作系统中的错误 - 这是非常主观的。就我个人而言,我认为操作系统应该跟踪注册者以复制交付,因为这是客户的意图 - 考虑到应用程序正在加入一个组以接收多播,这样想会有点误导。操作系统应该考虑到这一点。

我是通过经验证据得出这个结论的,可能不适用于其他平台。

于 2014-03-30T00:28:55.017 回答
-1

UDP,我猜是您的多播实现的基础,不保证交付。接收器或网络在过载时会丢弃数据包。您需要更高级别的协议来确保交付(谷歌可靠多播)。

于 2013-10-28T18:13:47.067 回答