使用 Java 实现多播,但有时其他主机无法收到多播消息

使用 Java 实现多播,但有时其他主机无法收到多播消息

我正在使用 Java 实现多播,但遇到了一些问题。当我从 [主机 A 接收器 -> 主机 B 接收器 -> 主机 A 发送器] 开始时,主机 B 无法接收多播消息。但是,当我从 [主机 B 接收器 -> 主机 A 接收器 -> 主机 A 发送器] 开始时,主机 B 可以接收多播消息。主机 A 和主机 B 位于同一个 LAN 中。这可能是什么原因造成的?

这是我的接收器和发送器代码。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * @author 肖嘉威 [email protected]
 * @date 2024/4/23 11:33
 */
public class MulticastSender {

    public static void main(String[] args) throws IOException {
        InetAddress group = InetAddress.getByName("234.2.3.4");
        int port = 12122;
        MulticastSocket ms = null;

        try {
            ms = new MulticastSocket(port);
            ms.joinGroup(group);
            while (true) {
                String message = "Hello " + new java.util.Date();
                byte[] buffer = message.getBytes();
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);
                ms.send(dp);
                System.out.println("发送数据报给" + group + ":" + port);
                Thread.sleep(2000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ms != null) {
                try {
                    ms.leaveGroup(group);
                    ms.close();
                } catch (IOException e) {
                }

            }
        }
    }
}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * @author 肖嘉威 [email protected]
 * @date 2024/4/23 11:34
 */
public class MulticastReceiver {
    public static void main(String[] args) throws Exception {
        InetAddress group = InetAddress.getByName("234.2.3.4");
        int port = 12122;
        MulticastSocket ms = null;
        try {
            ms = new MulticastSocket(port);
            ms.joinGroup(group);
            byte[] buffer = new byte[8192];
            while (true) {
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
                ms.receive(dp);
                String s = new String(dp.getData(), 0, dp.getLength());
                System.out.println(s);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally
        {
            if (ms !=null)
            {
                try
                {
                    ms.leaveGroup(group);
                    ms.close();
                } catch (IOException e) { }
            }
        }
    }
}

我使用了 wireshark。这是第一次启动顺序的结果

主机B

在此处输入图片描述

主机A

在此处输入图片描述

这是第二次启动顺序的结果

主机B 在此处输入图片描述 主机A 在此处输入图片描述

相关内容