2013-08-21 2 views
0

Я, я разрабатываю мобильное приложение (Android), которое работает с серверным приложением на ПК. Мне нужно использовать многоадресные датаграммы UDP для отправки информации на смартфон, подключенный к зоне WIFI. У меня есть два модуля: Первый модуль - многоадресный сервер UDP.Ядро многоадресной рассылки Java не получено из localhost

private void connection() { 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
    String msg = "Hello"; 
    InetAddress group = null; 
    try { 
     group = InetAddress.getByName("224.0.2.0"); 
    } catch (UnknownHostException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } 
    while (true) { 
     MulticastSocket s = null; 
     try { 
      s = new MulticastSocket(6789); 
     } catch (IOException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     try { 
      s.joinGroup(group); 
      s.setTimeToLive(200); 

     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     DatagramPacket hi = new DatagramPacket(msg.getBytes(), 
       msg.length(), group, 6789); 
     try { 

      s.send(hi); 
      System.out.println(hi.toString()); 
      s.leaveGroup(group); 
      s.close(); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

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

Эта функция (вверх) создать MulticastSocket и информацию об отправке на адрес многоадресной 224.0.2.0:6789.

Второй модуль представляет собой Java-приемник для UDP-пакетов, отправленных первой программой.

byte[] b = new byte[1024]; 
      DatagramPacket dgram = new DatagramPacket(b, b.length); 
      MulticastSocket socket = null; 
      try { 
       socket = new MulticastSocket(6789); 
      } catch (IOException e) { 
       Log.e("WIFI_E", e.getMessage()); 
      } // must bind receive side 
      try { 
       socket.joinGroup(InetAddress.getByName("224.0.2.0")); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      //while(true) { 
      try { 
       socket.receive(dgram); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } // blocks until a datagram is received 
      Toast.makeText(getApplicationContext(), "Received " + dgram.getLength() + 
         " bytes from " + dgram.getAddress(), Toast.LENGTH_LONG); 
      dgram.setLength(b.length); // must reset length field! 
      //} 

Это мой код. Теперь проблема. Когда я запускаю сервер (сторона ПК), UDP-пакеты видны только на локальной машине (тестируется с Wireshark), а smarthpone или другой компьютер не может их получить. Я пытаюсь отключить брандмауэр Windows и антивирус, но не работает. Я понятия не имею, почему пакеты не перенаправлены правильно в сети. Может быть, некоторые ошибки в моем коде? Спасибо вам.

+0

Как связаны разные машины? Возможно ли, что ваш маршрутизатор настроен не на отправку многоадресной рассылки? – xaxxon

+0

Вы уже нашли решение? Я борюсь с аналогичным проектом, который почти то же самое и не может заставить его работать. Примечание: Использование * nmap * Я обнаружил, что указанный порт остается закрытым при запуске программы. – s3lph

ответ

0

На устройстве Android вам необходимо приобрести MulticastLock. Кроме того, необходимы следующие разрешения:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 

Сказав, что, оказывается, что поддержка Multicast в Android не так твердо, как некоторые могли бы надеяться использования. См. http://codeisland.org/2012/udp-multicast-on-android/

Т.е. он действительно работает или может быть зависимым от устройства. Он не работает на моем Nexus5

+0

Я в том же случае. Как мы могли реализовать другой способ многоадресного UDP-пакета. Может быть, если бы мы могли кодировать на низком уровне. Но я не могу найти другое решение. Я увидел одну библиотеку, которая цепляется за коммуникацию для устройств PnP. И он работает на большинстве устройств, которые я могу проверить, когда Multicast не работал. Любое предложение об этом? –

+0

Я не могу комментировать Клин. Но я обнаружил, что могу заставить его работать, но мне нужно было поддерживать определенные адреса многоадресной рассылки. – William

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

  • Нет связанных вопросов^_^