Java多播发送数据,未接收

时间:2011-12-12 08:03:28

标签: java send multicast packet lan

我正在用Java编写一个用于大大简化多播过程的类。但是,我遇到了两个大问题:

  1. 该类发送数据(我可以使用我的网络监视器Wireshark进行验证),但同一组中的任何其他人都不会收到数据。
  2. 在某些机器上,传输过程中超出了发送数据包TTL(同样,根据Wireshark的说法)。
  3. 有人可以帮帮我吗?我一直在努力寻找几个小时的答案,看来我的代码遵循了从多播主机连接,加入,发送和接收数据的所有基本过程。

    以下是该课程相关部分的片段:

    多人课程:

    public class Multicaster {
      public int port = 5540;
    
      protected String IPAddress;
    
      private MulticastSocket msConn;
      private InetAddress netAddr;
    
      public Multicaster(String IPAddress) {
        this.IPAddress = IPAddress;
      }
    
      public String recieveData() {
        byte[] buf = new byte[1000];
        DatagramPacket pack = new DatagramPacket(buf, buf.length);
    
        try {
          this.msConn.receive(pack);
          new Message(pack);
          String out = new String(pack.getData());
          return out.substring(0, pack.getLength());
        } catch (IOException e) {
          return new String("");
        }
      }
    
      public void joinGroup() { 
        try {
          this.msConn.joinGroup(this.netAddr);
        } catch (IOException e) {
        //This error shouldn't occur since it would caught by the connect() method during initial connection to the host
        }
      }
    
      public void connect() throws MulticasterInitException {
      //Try to create a multicast connection on the given IP address and port
        try {
          try {
          //Create a multicast connection on a given port, throws UnknownHostException
            this.msConn = new MulticastSocket(this.port);
    
          //If all goes well, then create a connection to a given IP address using the above port number, throws IOException and SecurityException
            this.netAddr = InetAddress.getByName(this.IPAddress);
          }
        }
    
      /**
       * Here all of the possible exceptions that are thrown above
       * are caught and handled here. This works just fine.
       */
      }
    
      public void sendData(String data) throws MulticasterSendException {
        DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), this.netAddr, this.port);
    
        try {
          this.msConn.send(packet);
        } catch (IOException e) {
          throw new MulticasterSendException("Java could not communicate with the server. Please check your network connections.", e);
        }
      }
    }
    

    发送数据的示例用法:

    Multicaster multicast = new Multicaster("239.0.0.0");
    
    try {
      multicast.connect();
    } catch (MulticasterInitException e) {
      //Handle exception...
    }
    
    multicast.joinGroup();
    
    try {
      multicast.sendData("Hi");
    } catch (MulticasterSendException e) {
      //Handle exception... 
    }
    

    接收数据的示例用法:

    Multicaster multicast = new Multicaster("239.0.0.0");
    
    try {
      multicast.connect();
    } catch (MulticasterInitException e) {
      //Handle exception...
    }
    
    multicast.joinGroup();
    System.out.print(multicast.recieveData());
    

1 个答案:

答案 0 :(得分:6)

我之前遇到过类似的问题,必须确保在接收端指定了NetworkInterface。

SocketAddress socketAddress = new SocketAddress(groupIp, groupPort);
NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName);

socket.joinGroup(socketAddress, networkInterface);

interfaceName是在Linux或Mac上运行ifconfig时显示的接口名称之一。