Многоадресная рассылка в Java не работает - PullRequest
4 голосов
/ 05 февраля 2012

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

Я положил 2 сервера в 2 разных папках.и я назначил IP-адреса моей сетевой карте, как это ifconfig eth0:3 192.168.0.11 netmask 255.255.255.0 up как мне сообщить каждому серверу о новом IP-адресе?

BroadcastListner

class BroadcastListner implements Callable<Object> {
    int PORT = 1110;
    String IP = "255.255.255.255";
    MulticastSocket socket ; 
    DatagramPacket packet;
    InetAddress IPAD; 
    byte data[] =  null ;  //////////////change size
    int numOfNodes;

    BroadcastListner(String IP, int numOfNodes) {
        try {
            this.numOfNodes = numOfNodes;
        this.IP = IP;
        IPAD = InetAddress.getByName(IP);
        socket = new MulticastSocket(PORT);
        packet = new DatagramPacket(data,data.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    BroadcastListner(int numOfNodes) {
        try{
            this.numOfNodes = numOfNodes;
            // this.IP = IP;
            IPAD = InetAddress.getByName(IP);
            socket = new MulticastSocket(PORT);
            packet = new DatagramPacket(data,data.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String call() {
        try{
            socket.joinGroup(IPAD);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }

        while(true) {
            try {
                socket.receive(packet); 
                String str = new String(packet.getData());
                System.out.println(" Time signal received from"+
                packet.getAddress() + " Time is : " +str);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }

        //socket.leaveGroup(IPAD);
        //socket.close();
        //return "";
    }
}

BroadcastSender

class BroadcastSender implements Callable<Object> {
    int PORT = 1110;
    String IP = "255.255.255.255";
    MulticastSocket socket; 
    DatagramPacket packet;
    InetAddress IPAD; 
    byte[] data = "IAmAServer".getBytes(); 
    //int numOfNodes;
    String str = "IAmAServer";

    BroadcastSender(String IP) {
        try {
            // this.numOfNodes = numOfNodes;
            this.IP = IP;
            IPAD = InetAddress.getByName(IP);
            socket = new MulticastSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    BroadcastSender() {
        try{
            // this.numOfNodes = numOfNodes;
            // this.IP = IP;
            IPAD = InetAddress.getByName(IP);
            socket = new MulticastSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String call() {
        try {
            socket.joinGroup(IPAD);
            socket.setTimeToLive(10);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }

        while(true) {
            try {
                Thread.sleep(2000);
                packet = new DatagramPacket (data,str.length(),IPAD,PORT);
                socket.send(packet);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
        //return "";
    }
}

1 Ответ

0 голосов
/ 05 февраля 2012

Вам нужно попробовать широковещательный адрес 192.168.0.255

Альтернативой является использование многоадресной передачи вместо широковещательного адреса, например 224.xxx, который не привязан к определенной подсети.

...