2016-12-19 1 views
4

Je suis extrême pertes de paquets UDP avec Android et cela n'a pas de sens. La situation est la suivante:java - android UDP unreliability

  1. PC client java fonctionnement connecté au réseau domestique
  2. téléphone qui exécute le serveur Java (Android) connecté au réseau domestique
  3. routeur domestique est une toute nouvelle WRT1900ac. Le réseau a une connectivité Internet.
  4. paquets UDP sont petits (< 15 octets)

Symptômes:

  1. Si PC envoie paquets UDP à un autre PC (à la fois sur le même réseau), il fonctionne très bien (presque pas de paquets perdus).

  2. Si Android envoie un paquet UDP à un PC sur le même réseau, il fonctionne également très bien (presque pas de paquets perdus).

  3. Si PC envoie UDP à Android sur le même réseau, je reçois des pertes de paquets extrêmes (50% du temps ou plus - mais cela varie).

La plupart du temps, je suis obligé d'envoyer le paquet comme 10 fois pour obtenir un à. D'autres fois, tous arrivent avec un certain retard. Comportement très étrange qui ne se produit que sur la réception d'Android. Si je remplacer android avec pc exécutant le même code sur Java ou simplement recevoir le paquet via le serveur UDP de Packet Sender Je n'ai pas de problèmes de perte. Une autre chose que j'ai remarqué est que si au lieu de passer par le routeur je passe par un autre point d'accès qui n'a pas de connectivité Internet ou aucune autre performance des clients semble s'améliorer considérablement. Ceci est attendu, mais ma question est pourquoi la réception de la fin de Android voit une telle mauvaise performance et perdre autant de paquets. Lorsque Android est remplacé par un autre PC exécutant le même code et sur le même réseau, il n'y a pas de problèmes. Android également n'a aucun problème à envoyer les paquets (aucuns paquets sont perdus). Par conséquent, il doit être quelque chose d'autre Android liés à la réception ...

J'ai également essayé de remplacer le code PC avec Packet Sender et j'obtiens le même résultat. Le problème semble être la fin de la réception d'Android. Je cours le même code UDP sur le PC et sur Android.

Le code envoi UDP est simple:

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(); 
    } 
} 

Le code reçu UDP sur la vie android dans une classe de serveur 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(); 
     } 

    } 
} 

Le UDPServer.classe java est instancié par l'activité principale méthode « 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

Je ne sais pas si c'est quelque chose qui peut être résolu de cette façon ... il ne me surprendrait pas si vous deviez utiliser un outil comme wireshark ou alors pour observer attentivement tout le trafic réseau pour comprendre ce qui se passe. – GhostCat

+0

Comme mentionné ci-dessus, essayez d'utiliser wireshark et voyez ce qui se passe. En outre, essayez un autre appareil Android si possible pour voir si votre appareil a un problème. – jython234

Répondre

0

j'ai eu des résultats catastrophiques avec certains appareils Android d'envoyer un fichier sur un serveur TFTP (basé sur UDP) sur WiFi, mais il semblait travailler bien avec d'autres appareils Android.

Les blocs de données (de l'appareil au serveur) ont été correctement envoyés, mais les blocs d'accès (du serveur à l'appareil) semblaient être perdus dans les limbes.

Il s'avère que je devais acquérir un verrou de multidiffusion pour les appareils défectueux pour fonctionner correctement (crédits 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(); 

Hope this helps.