2016-06-01 2 views
0

Это мой первый пост, поэтому он может быть не очень стильным, но я пробовал ... Итак ... У меня две машины, работающие на Java. Я хочу, чтобы они запускали что-то вроде этого.Java Multicast Socket не отправляет данные

Клиент: отправляет многоадресную рассылку на серверы прослушивания. Сервер (ы): сервер фиксирует многоадресную рассылку и отправляет одноадресную рассылку с именем локальной машины, на которой выполняется сервер. Клиент: получает одноадресную рассылку с адресами сервера и делает список с именами хостов.

Но клиент даже не отправляет многоадресную рассылку (я смотрел пакеты захвата wirehark) Он отправляет что-то, когда я ставил 230.0.0.1 в качестве многоадресного адреса, но тогда сервер не получает пакет.

EDIT: Когда я отправляю одноадресный пакет на сервер, он отвечает штрафом.

Вот мой код:

try 
    { 
     //The client runs on LeJOS EV3 so I used their classes a bit 
     LCDOutputStream lcd = new LCDOutputStream(); 
     PrintStream p = new PrintStream(lcd); 
     while(true) 
     { 
      if(Button.waitForAnyPress() == Button.ID_ESCAPE) 
      { 
       break; 
      } 

      byte[] buf = this.writeString("get_ip"); 
      DatagramSocket sender = new DatagramSocket(); 

      DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("230.0.0.1"), 5555); 
      sender.send(packet); 
      sender.close(); 
      p.println("Sent Multicast"); 
     } 
     p.close(); 
     lcd.close(); 
    } 
    catch(Exception e) 
    { 
     console.printException(e); 
    } 

Вот код сервера:

MulticastSocket s = new MulticastSocket(5555); 
       s.joinGroup(InetAddress.getByName("225.1.1.1")); 
       while(true) 
       { 
        try 
        { 
         /* 
         * 225.1.100.1 
         * 
         DataSender.Impl.reply("225.1.100.1", 5555, InetAddress.getLocalHost().getHostName(), "get_ip");*/      
         byte[] buf = new byte[256]; 
         DatagramPacket p = new DatagramPacket(buf, buf.length); 
         s.receive(p); 
         System.out.println("DEBUG: received request"); 
        } 
        catch(IOException e) 
        { 
         e.printStackTrace(); 
         break; 
        } 
       } 
       s.close(); 
+0

'while (true)' is ** bad code ** и сделает его тупиковым в какой-то момент времени - ваше ядро ​​может пропустить ** любую ** часть * (все, даже) * ваше тело цикла, и если это произойдет, ваш цикл продолжится навсегда, поставив 100% нагрузку на ваш планировщик - такое состояние приложения обычно считается «зависанием». Не пытайтесь использовать «классные трюки» или что-то в этом роде, код, который не имеет реальной функции автоматически, является плохим и источником ошибок программы. – specializt

+0

@specializt Циклы не вызывают взаимоблокировок. Ядра не выполняют Java-код, и если бы они это сделали, они не пропускали бы части циклов. 'while (true)' не является ни «плохим», ни «классным трюком» и имеет «реальную функцию». – EJP

+0

@specializt Я использую «while (true)» в отдельном потоке, чтобы сервер отвечал на пакеты все время, пока программа жива, не только один раз, а затем игнорирует все остальные входящие пакеты. EDIT: Я забыл сказать, когда я отправляю одноадресную рассылку на сервер, он хорошо реагирует. –

ответ

0

Замечания, сделанные ecle в ответ на следующий пост помог мне решить подобную проблему: Java Multicast sample program is unable to deliver packets within LAN (across hosts) , В моем случае работало setInterface(<server address>);. Например:

MulticastSocket s = new MulticastSocket(5555); 
s.setInterface(<server address>); 
s.joinGroup(InetAddress.getByName("225.1.1.1")); 
+0

Я забыл упомянуть, что вы также сможете использовать это в своем коде клиента, а не в DatagramSocket. Или, как упоминалось в связанном сообщении, вам может понадобиться использовать конструктор 'DatagramSocket (int port, InetAddress laddr)' для привязки к правильному интерфейсу. – wgw

+0

работает, работая как на локальном хосте, так и используя ваш адрес 225.1.1.1 –

Смежные вопросы