Странное / необъяснимое поведение Eclipse и многоадресных пакетов - PullRequest
1 голос
/ 23 марта 2011

У меня очень похожее поведение, как описано здесь :

  • работает на Mac Book Pro, Snow Leopard
  • использование многоадресных сокетов для отправки и получения пакетов на локальном хосте

Я использую Eclipse и наблюдал следующее поведение при запуске клиента / сервера из рабочей области:

  • если беспроводной интерфейс (аэропорт) запущен и работает, клиент не принимает пакеты
  • если интерфейс выключен, все работает как положено

Но я не понимаю:

  • если я создаю JAR и запускаю код на любой консоли -> все хорошо! Просто Затмение, похоже, не любит аэропорт; -)
  • в зависимости от того, к какой беспроводной сети я подключен, вышеуказанное поведение может измениться, т. Е. Оно также работает, если включен аэропорт (например, @ Uni)

У кого-нибудь есть идеи по этому поводу?

Приветствия

Ниже простой код для сервера / клиента:

@Override
public void run() {
    String multicastAddress = "224.0.0.2";
    int multicastPort = 8000;
    MulticastSocket socket = null;
    try {
        try {
            InetAddress multicastGoup = InetAddress.getByName(multicastAddress);
            socket = new MulticastSocket(multicastPort);
            socket.joinGroup(multicastGoup);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        byte[] buffer = new byte[1024];

        while (true) {
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            System.out.println("BEFORE RECEIVE: listening on " + multicastAddress + ":" + multicastPort);
            socket.receive(packet);
            System.out.println("PACKET RECEIVED");

            System.err.println("Client received: " + new String(packet.getData()));
        }

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        socket.close();
    }

}

Сервер:

    public void run() {
    MulticastSocket socket = null;
    try {
        String multicastAddress = "224.0.0.2";
        int multicastPort = 8000;
        InetAddress multicastGoup = InetAddress.getByName(multicastAddress );
        socket = new MulticastSocket(multicastPort);
        socket.joinGroup(multicastGoup);

        byte[] data = new String("Teststring").getBytes();

        while (true) {
            socket.send(new DatagramPacket(data, data.length, multicastGoup, multicastPort));
            System.out.println("SERVER: Datagram sent");
            Thread.sleep(1000);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        socket.close();
    }
}

1 Ответ

1 голос
/ 23 марта 2011

С Класс MulticastSocket :

void  joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
          Joins the specified multicast group at the specified interface.

Попробуйте использовать определенный интерфейс, чтобы ваша группа присоединения не попала в настройки по умолчанию, которые могут различаться в зависимости от доступных, открытых или в зависимости от настроек Eclipse.

joinGroup

public void joinGroup(SocketAddress mcastaddr,
                      NetworkInterface netIf)
               throws IOException

  Joins the specified multicast group at the specified interface.

  If there is a security manager, this method first calls its
  checkMulticast method with the mcastaddr argument as its argument.

  Parameters:
    mcastaddr - is the multicast address to join
    netIf - specifies the local interface to receive
        multicast datagram packets,
      -- here is the catch
      or null to defer to the interface set by
        setInterface(InetAddress) or 
        setNetworkInterface(NetworkInterface) 
...