Не удается получить строку из многоадресной рассылки UDP

У меня возникли проблемы с получением строки из многоадресной рассылки. Я впервые использую многоадресную рассылку UDP в Java.

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

Я позволил серверу отправлять многоадресную рассылку со своим собственным IP-адресом в виде строки каждые 5 секунд. Клиенты должны иметь возможность его получить. Проблема в том, что они ничего не получают. Я тестирую 2 устройства, поэтому мне не нужно использовать локальный хост.

Вот часть моего кода: Серверная сторона:

открытый класс MulticastIpSender расширяет Thread{

private String serverIp;
private int port;
private String multicastAddress;
private long WAITING_TIME = 5000;  // 5 seconden

private DatagramSocket socket;

public MulticastIpSender(String serverIp, int port, String multicastAddress) throws SocketException {
    super();
    this.serverIp = serverIp;
    this.port = port;
    this.multicastAddress = multicastAddress;
    socket = new DatagramSocket(port);
}

public void run() {
    while(true){
        try {
            byte[] buf = new byte[256];
            buf = serverIp.getBytes();
            InetAddress group = InetAddress.getByName(multicastAddress);
            DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
            socket.send(packet);
            System.out.println("sent IP("+serverIp+") to group("+group+") on port "+port);
            sleep(WAITING_TIME);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

}

Я поместил этот метод в основной класс:

private void sendIpAddressToListeners() {
    try {
        multicastIpSender = new MulticastIpSender(serverIp,PORT,"230.0.0.1");
        multicastIpSender.run();
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

Я получаю serverIp следующим образом:

    String hostName = InetAddress.getLocalHost().getHostName();
        InetAddress addrs[] = InetAddress.getAllByName(hostName);
if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress()) {
        myIp = addr.getHostAddress();
        }
        }
        System.out.println ("\nIP = " + myIp);
        return myIp;

на этом устройстве он дает мне 192.168.1.2

СТОРОНА КЛИЕНТА:

multicastSocket = new MulticastSocket(PORT);
        InetAddress address = InetAddress.getByName(MULTICAST_ADDRESS);
        multicastSocket.joinGroup(address);

        DatagramPacket serverIpPacket;
        byte[] buf = new byte[256];
        serverIpPacket = new DatagramPacket(buf, buf.length);
        while(receivedIp ==null){
            multicastSocket.receive(serverIpPacket);
            receivedIp = new String(serverIpPacket.getData(), 0, serverIpPacket.getLength());
            System.out.println("received server ip: " + receivedIp);
        }

!! ПОРТ = 4445 как на сервере, так и на клиенте

Я надеюсь, что кто-то может помочь мне с этим или может объяснить лучший способ сделать это.


person dumazy    schedule 18.10.2012    source источник
comment
Вам не нужно явно отправлять IP-адрес в пакете, клиенты должны просто иметь возможность проверить, какой IP-адрес отправил пакет, и ответить на это.   -  person Wug    schedule 18.10.2012
comment
Все советы по сети верны. Кроме того, вы, вероятно, захотите использовать multicastIpSender.start(); если вы делаете какую-либо реальную многопоточность. Прямой вызов run() просто выполняет метод run() из вызывающего потока, тогда как start() создает новый поток для его обработки. В вашем случае это может быть неважно.   -  person mfrankli    schedule 18.10.2012
comment
ну, я до сих пор не нашел решения, но может быть, он заблокирован из-за брандмауэра? это только в моей локальной сети...   -  person dumazy    schedule 18.10.2012
comment
это работает, если я запускаю его на одном устройстве, но мне нужно работать на двух разных устройствах. Я видел кое-что о setInterface(inetaddress) на multicastsocket. но я не могу найти правильный интерфейс...   -  person dumazy    schedule 18.10.2012


Ответы (1)


Отправьте обычный DatagramPacket на широковещательный адрес, пакет будет получен всеми хостами в локальной сети (с той же конфигурацией сети, важной частью является маска)

Используйте калькулятор, чтобы проверить свой широковещательный адрес, этот хорошо работает: http://www.subnet-calculator.com/< /а>

person Adrian Adamczyk    schedule 18.10.2012