谁能解释为什么我的 java 代码多播无法通过 LAN 工作?

Can anyone explain why my java code multicast is not working over LAN?

我下面有两个应用程序。我使用 java MulticastSocket 发送和接收 DatagramPacket.

发件人

public class Sender {

    public static void main(String[] args) throws IOException {
        int port = 5000;
        String group = "225.4.5.6";
        final MulticastSocket s = new MulticastSocket();
        byte[] buf = new byte[10];
        for (int i = 0; i < buf.length; i++) {
            buf[i] = (byte) i;
        }
        final DatagramPacket pack = new DatagramPacket(buf, buf.length,
                InetAddress.getByName(group), port);
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                try {
                    s.send(pack);
                    System.out.println("Sent");
                } catch (IOException ex) {
                    Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 0, 1000);
        //s.close();
    }
}

接收器

public class Receiver {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        int port = 5000;
        String group = "225.4.5.6";
        MulticastSocket s = new MulticastSocket(port);
        s.joinGroup(InetAddress.getByName(group));
        byte[] buf = new byte[1024];
        DatagramPacket pack = new DatagramPacket(buf, buf.length);
        while (true) {
            s.receive(pack);
            System.out.println("Received data from: " + pack.getAddress().toString()
                    + ":" + pack.getPort() + " with length: "
                    + pack.getLength());
            System.out.write(pack.getData(), 0, pack.getLength());
            System.out.println();
        }
//        s.leaveGroup(InetAddress.getByName(group));
//        s.close();
    }

}

当我在本地主机上 运行 这段代码工作正常。但是当我尝试 运行 它在两台不同的计算机上通过 LAN 时,我无法接收数据包。

我两台电脑的防火墙都关了

谁能解释一下为什么?

编辑

我的路线table:

Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.0.1    192.168.0.103     25
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link     192.168.0.103    281
    192.168.0.103  255.255.255.255         On-link     192.168.0.103    281
    192.168.0.255  255.255.255.255         On-link     192.168.0.103    281
    192.168.164.0    255.255.255.0         On-link     192.168.164.1    276
    192.168.164.1  255.255.255.255         On-link     192.168.164.1    276
  192.168.164.255  255.255.255.255         On-link     192.168.164.1    276
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link     192.168.164.1    276
        224.0.0.0        240.0.0.0         On-link     192.168.0.103    281
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link     192.168.164.1    276
  255.255.255.255  255.255.255.255         On-link     192.168.0.103    281

您是否为多播地址添加了路由?在 Linux 你必须这样做:

route add -net 224.0.0.0/4 eth0

(假设连接两台机器的网络接口都是eth0)

在 Windows 上,在控制台 (cmd.exe) 提示符下键入 route print(您可能需要管理员权限)并检查此类行:

    224.0.0.0        240.0.0.0      En vínculo         127.0.0.1    306
    224.0.0.0        240.0.0.0      En vínculo      192.168.56.1    276
    224.0.0.0        240.0.0.0      En vínculo    192.168.10.100    266
    224.0.0.0        240.0.0.0      En vínculo      192.168.79.1    276
    224.0.0.0        240.0.0.0      En vínculo      192.168.34.1    276

(这是一台西班牙语机器:“En vínculo”的意思是“链接到”)

Windows 列出多播数据包的多个可能路由。发送程序实际使用的路由是度量最低的路由(最后一列编号)。在我的设置中,路由使用 192.168.10.100(我的主网卡)的网络接口。

检查您的机器是否将其网卡列为多播的最低公制接口。您可能将 127.0.0.1 作为多播 (localhost) 的主要接口,而不是您的物理网络接口。

此外,您可能希望使用多播组地址 224.0.0.1 来测试可达性。这是全主机多播组。假定任何多播数据包都能够被同一子网内的任何主机接收。查看 RFC 5771 以获取有关多播地址分配的更多信息:https://www.rfc-editor.org/rfc/rfc5771

请注意,如果两台机器都在同一个子网中(例如,连接到同一个交换机),多播效果会更好。如果中间有路由器,事情就复杂多了。