有人能解释为什么我的java代码多播不能在LAN上工作吗?

有人能解释为什么我的java代码多播不能在LAN上工作吗?,java,networking,multicast,Java,Networking,Multicast,我有两个申请如下。我使用javaMulticastSocket发送和接收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 Multicast

我有两个申请如下。我使用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();
    }

}
当我在本地主机上运行该代码时,它可以正常工作。但当我试图通过局域网在两台不同的计算机上运行它时,我无法接收数据包

我已关闭两台计算机上的防火墙

有人能解释一下原因吗?

编辑

我的路线表:

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:


请注意,如果两台计算机位于同一子网(例如,连接到同一交换机),则多播效果更好。如果中间有路由器,事情就复杂得多。

大多数防火墙都有例外规则。防火墙可以过度依赖;但是打开防火墙通常要安全得多。问题可能不在代码中。看看你的路由器的配置。它可能在那里被禁用。如果你对你的路由器进行了大量篡改,但它不是专业级的,你可能想尝试备份设置(通常有一个功能),重置,尝试你的程序,并恢复路由器的配置备份。我完全同意@Motokokukusanagi,但在两个防火墙都关闭的情况下进行测试仍然是正确的。@Scruffy我想是的,但我用我的笔记本电脑
ad-hoc
将两台计算机点对点连接起来,但它仍然无法工作。在windows上如何进行此操作?在windows中,多播路由已经定义。从控制台发出
route print
命令,查看是否有类似
224.0.0.0 240.0.0.0
和用于连接到另一台计算机的网络接口的IP地址。如果是这样的话,那么就有一个以上的224。。。。。行,检查列出界面的那一行是否具有最低的度量值是的,我看到了那几行。我应该在代码中使用
224.0.0.0
地址吗?我已经编辑了我的帖子。我有3行
224.0.0.0
,我的主要接口地址是
192.168.0.103
,因此您可以看到您的多播数据包没有被发送到所需的接口,因为具有最低度量的接口是
192.168.164.1
。从提升的命令提示符更改
192.168.0.103
接口的度量,如下所示:
route Change 224.0.0.0/4 192.168.0.103 metric 100