java中的多播

时间:2011-02-21 22:30:59

标签: java multicast

我正在尝试编写一个简单的多播试用版。

我使用了标准代码(发件人和收件人)。

我尝试了一些不同的标准代码。接收代码似乎停留在接收上(好像它没有收到任何东西)。

接收方:

        byte[] b = new byte[3];
    DatagramPacket dgram = new DatagramPacket(b, b.length);
    MulticastSocket socket =
      new MulticastSocket(4545); // must bind receive side
    socket.joinGroup(InetAddress.getByName("226.100.100.125"));

    while(true) {
      socket.receive(dgram); // blocks until a datagram is received
      System.err.println("Received " + dgram.getLength() +
        " bytes from " + dgram.getAddress());
      dgram.setLength(b.length); // must reset length field!
    }

发送方:

      DatagramSocket socket = new DatagramSocket();

  byte[] b = new byte[]{(byte)1,(byte)5,(byte)3};
  DatagramPacket dgram;

  dgram = new DatagramPacket(b, b.length,
    InetAddress.getByName("226.100.100.125"), 4545);

  System.err.println("Sending " + b.length + " bytes to " +
    dgram.getAddress() + ':' + dgram.getPort());
  while(true) {
    System.err.print(".");
    socket.send(dgram);
    Thread.sleep(1000);
  }

我的代码出了什么问题? * 我尝试了很多不同的IP *

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

尝试从同一IP接收,但发送到localhost。如果这样可行,那么它就是你的路由器,因为它不支持多播。如果这仍然不起作用那么它就是IP地址。尝试233.x.x.x - 239.x.x.x范围内的东西。

我在我的计算机上运行了你的代码并且工作正常,如果我将发送地址更改为localhost也可以。听起来这是路由器的问题,而不是你的代码。

答案 1 :(得分:2)

网络239.0.0.0/8被指定用于管理员多播流量。如果您的所有计算机都在同一网段,则可以使用此网络中的ip来进行多播。

以下是定义这些内容的RFC:

http://tools.ietf.org/html/rfc2365

就发送方式而言......你的代码应该是这样的:

            DatagramPacket p = ...
            MulticastSocket s = new MulticastSocket(LISTENPORT);
            InetAddress group = InetAddress.getByName(LISTENIP);
            s.joinGroup(group);
            s.send(p);
            s.leaveGroup(group);

答案 2 :(得分:1)

组播通常(在实际网络中)取决于路由器的支持。从我所知道的一般情况来看,你不能指望得到正确的支持。我会尝试从不同的客户端(命令行或其他)发送数据包,以查看服务器端是否正确绑定。

另一方面,如果你看一下:http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml这就是226地址块被标记为保留。引用的RFC sais:

  
      
  1. 使用IANA预留地址

         

    应用程序不得使用   在IANA保留中寻址   块。

  2.   

这也可能与它有关。

答案 3 :(得分:0)

你不应该使用相同的端口,尝试不同的端口并创建一个用于接收的套接字和第二个用于发送的套接字。

答案 4 :(得分:0)

当我在Linux机上发生这种情况时,我会检查以确保

1)在正确的接口上有224.0.0.0/4的路由 2)源IP地址与该接口的其中一条路由匹配

#2是我实验室中最粘的。如果我的eth1只有10.77.4.0/24的路由,而某个盒子从10.78.5.15传输,则linux将其丢弃为“火星包”。