2016-12-19 32 views
4

У меня есть крайний UDP-пакет потерь с Android, и это не имеет смысла. Ситуация выглядит следующим образом:java - android UDP ненадежность

  1. PC работает Java-клиент подключен к домашней сети
  2. Телефон работает Java-сервер (Android), подключенного к домашней сети
  3. Home маршрутизатор новый WRT1900ac. Сеть имеет подключение к Интернету.
  4. UDP пакеты маленькие (< 15 байт)

Симптомы:

  1. Если компьютер посылает UDP пакет на другой компьютер (как в той же сети) она работает очень ну (почти никаких пакетов не потеряно).

  2. Если Android отправляет пакет UDP на ПК в той же сети, он также работает очень хорошо (почти никаких пакетов не потеряно).

  3. Если ПК отправляет UDP на Android в той же сети, я получаю экстремальные потери пакетов (в 50% случаев и более - но это зависит от типа).

В большинстве случаев я вынужден послать пакет как 10 раз, чтобы получить один через. В других случаях все проходит довольно долго. Очень странное поведение, которое происходит только на приемном конце андроида. Если я заменить андроид с ПК, на котором работает тот же код на java или просто получает пакет через UDP-сервер Packet Sender У меня нет потерь вопросов. Еще одна вещь, которую я заметил, заключается в том, что если вместо перехода через маршрутизатор я перехожу через другую точку доступа, которая не имеет подключения к интернету или никакая другая производительность клиентов, как представляется, значительно улучшается. Это, как ожидается, но мой вопрос заключается в том, что приемная сторона Android видит такие плохие показатели и проигрывает так много пакетов. Когда Android заменяется другим ПК, на котором работает тот же код, и в той же сети нет проблем. Android также нет проблем с отправкой пакеты (никаких пакетов не пропало). Поэтому на приемном конце должно быть что-то еще, связанное с android ...

Я также попытался заменить код ПК на Sender пакета и получить те же результаты. Проблема, похоже, в том, что приемник Android. Я запускаю тот же UDP-код на стороне ПК и на Android.

Передающий код UDP прост:

public void sendMessage(String message) 
{ 
    try { 
     DatagramSocket ds = new DatagramSocket(); 
     DatagramPacket dp; 
     InetAddress local = InetAddress.getByName(ipPool); 
     dp = new DatagramPacket(message.getBytes(), message.length(), local, port); 
     ds.setBroadcast(true); 
     ds.send(dp); 
     ds.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

UDP-прием кода на андроид жизни в UDP-класса сервера:

public class UDP_Server 
{ 
    CommandParser commandParser; 

    public UDP_Server(MainActivity mainActivity) 
    { 
     Log.i("Udp tutorial", "---------------------------Starting UDP SERVER"); 

     commandParser = new CommandParser(mainActivity); 
     String text; 
     int server_port = 9876; 
     try 
     { 
      DatagramSocket s = new DatagramSocket(server_port); 
      s.setBroadcast(true); 
      //s.setReceiveBufferSize(163840); 


      while (true) 
      { 
       byte[] message = new byte[1024]; 
       DatagramPacket p = new DatagramPacket(message, message.length); 

       s.receive(p); 
       text = new String(message, 0, p.getLength()); 
       Log.d("Udp tutorial","message:" + text); 
       //commandParser.parseCommand(text); 
       //s.close(); 
      } 
     } catch (SocketException e) 
     { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

UDPServer.класс Java конкретизируется через основную деятельность «OnCreate()» метод:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

     wm = (WifiManager) getSystemService(WIFI_SERVICE); 

     Log.i("Udp tutorial", "---------------------------HERE 1"); 
     Thread thread = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       UDP_Server svr = new UDP_Server(MainActivity.this); 
      } 
     }); 

     thread.setPriority(Thread.MAX_PRIORITY); 
     thread.start(); 
//  TCPServer server = new TCPServer(); 
    } 
+0

Не уверен, что это может быть разрешено таким образом ... это не удивило бы меня, если бы вам пришлось использовать какой-то инструмент, например wirehark, чтобы внимательно наблюдать за всем сетевым трафиком, чтобы понять, что происходит. – GhostCat

+0

Как уже было сказано, попробуйте использовать wirehark и посмотрите, что происходит. Кроме того, попробуйте другое устройство Android, если это возможно, чтобы узнать, есть ли у вашего устройства проблемы. – jython234

ответ

0

я имел катастрофические результаты с некоторым Android устройств отправки файла на TFTP (на основе UDP) сервер через WiFi, но это, казалось, работали хорошо с другими устройствами Android.

Блоки данных (от устройства к серверу) были отправлены надлежащим образом, но блоки блокировки (от сервера к устройству), казалось, были потеряны в подвешенном состоянии.

Оказывается, я должен был приобрести групповую блокировку для тех неисправных устройств работать должным образом (кредиты https://www.b4x.com/android/forum/threads/enable-multicast.43321/#post-263242)

WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

... 

multicastLock.release(); 

Надеется, что это помогает.