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] からのメッセージをリッスンして受信する 4 つの並列スレッドがあります。テストでは、2 つのプログラムを同時に実行して、それらの間の通信をテストします。それでも、プログラム A がメッセージをマルチキャスト アドレスに送信し、正しいケースでは、A もそれを受信し、B も受信することがあることを発見しました。または B 再度受信します。ローカル マシン (Mac OS 10.9 with core 2 duo) でテストを実行します。この問題は、私のコンピューターまたは他の何かが原因である必要がありますか?
どうもありがとうございました。

4

2 に答える 2

-1

UDP は、マルチキャストの実装の根底にあると思われますが、配信を保証するものではありません。レシーバーまたはネットワークは、過負荷になるとパケットをドロップします。確実に配信するには、より高度なプロトコルが必要です (Google の信頼できるマルチキャスト)。

于 2013-10-28T18:13:47.067 に答える