Отправка данных многоадресной рассылки Java, а не получение - PullRequest
5 голосов
/ 12 декабря 2011

Я пишу класс на Java, который используется, чтобы значительно упростить процесс многоадресной рассылки. Однако у меня две большие проблемы:

  1. Класс отправляет данные (я могу проверить это с помощью моего сетевого монитора, Wireshark), но данные не принимаются другими пользователями из той же группы.
  2. На некоторых машинах превышен TTL отправляемого пакета при передаче (опять же, согласно Wireshark).

Может ли кто-нибудь помочь мне? Я часами пытался найти ответы, и похоже, что мой код соответствует всем основным процедурам подключения, объединения, отправки и получения данных с многоадресного хоста.

Вот фрагмент соответствующих частей класса:

Класс Multicaster:

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 Ответ

6 голосов
/ 12 декабря 2011

Ранее я сталкивался с подобными проблемами и должен был убедиться, что NetworkInterface был указан на принимающей стороне.

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

socket.joinGroup(socketAddress, networkInterface);

Где interfaceName - это одно из имен интерфейсов, отображаемых при запуске ifconfig в Linux или Mac.

...