IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

réception socket UDP lente


Sujet :

API standards et tierces Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut réception socket UDP lente
    Bonjour à tous,

    Je suis en train de développer une application sur Android à l'aide de Libgdx. Celle-ci récupère des données transmires via wifi par une application tournant sur windows et s'en sert pour l'application android. Le taux d'émission de l'application windows est de 99 paquets/s.

    Le souci que je rencontre est que les paquets mettent du temps à être reçu, du coup mon affichage n'est pas fluide du tout.
    j'ai utilisé un thread pour le côté réception de paquets.

    J'aimerai votre avis, qu'est ce qui ne va pas dans mon implémentation? Est ce que le choix d'utiliser des paquets UDP est judicieux? Y'a-t-il une meilleure façon de procéder?

    Un grand merci d'avance.

    Bien à vous.

    ps: ci dessous le code que j'utilise dans la classe gamescreen de mon application Libgdx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    try {
    ****socket = new DatagramSocket(port);
    ****paquet = new DatagramPacket(buffer, buffer.length);
    *
    }
    *
    catch (SocketException e)
    {
    ****e.getMessage();
    }
    catch (IOException e)
    {
    ****e.getMessage();
    }
    *
    copar = new byte[4];
    *
    new Thread(new Runnable() {
    ****@Override
    ****public void run() {
    *********
    ******while(true){
    ********try {
    ************socket.receive(paquet);
    ************arr = paquet.getData();
    *
    ************for (int i=10+2*36-1; i<=13+2*36-1; i++)
    ************{copar[i-10-2*36+1] = paquet.getData()[i];}
    ************ptc= ByteBuffer.wrap(copar).order(ByteOrder.LITTLE_ENDIAN).getFloat();
    ********}
    *
    ********catch (IOException e)
    ********{
    ************e.getMessage();
    ********}
    *
    ********Gdx.app.postRunnable(new Runnable() {
    ************@Override
    ************public void run() {
    ***********************************results.add(result);
    ************}
    ********});
    ****}}
    }).start();

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    En dehors de tout applicatif, tu devrais faire un test aller/retour d'un paquet UDP pour vérifier le temps de transfert. Ensuite, envoyer un maximum de paquet pour tester le débit maximum.
    Si les temps sont mauvais, alors tu ne peux rien faire, cela vient de ton réseau.
    Par contre, si les temps sont excellents, il est très probable que le fautif sur la latence ne soit pas le réseau ni le code qui émet/reçois mais plutôt le code applicatif autour de tout ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'ai vérifié les paquets udp. Avec TCPdump, j'ai un paquet tous les 40ms. Par contre, en utilisant System.currentTimeMillis() pour mesurer le temps d'execution du thread, je vois qu'il faut
    100 ms à android pour récupérer le paquet, et ce temps varie fortement. On dirait qu'il y a un blocage, il peut monter jusque 1.5s voire 3s dans certains cas.

    Quand tu parles de code applicatif, tu veux dire la façon dont android gère le matériel?

    Que puis-je faire dans ce cas-ci? Passer par l'usb, le bluetooth?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Praetor.Fenix Voir le message
    Quand tu parles de code applicatif, tu veux dire la façon dont android gère le matériel?
    Non, pas du tout. Je parle de faire une application minimaliste pour tester le débit sur Android, sans être polluer par ton application qui utilise les paquet UDP. Une fois fait, tu es sûr que soit c'est ton code qui est foireux, soit ça ne vient pas de ton code. C'est une information primordiale pour savoir par où commencer le debug.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour le coup de main.

    J'ai trouvé la faille. Afin d'éviter à l'utilisateur de rechercher son adresse IP et de l'introduire dans le programme qui tourne sur windows, j'avais configuré celui-ci pour qu'il transmette sur le broadcast.
    Du coup, la transmission était lente. En introduisant l'IP de la machine directement, je suis descendu à un ping constant de 50ms.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. socket : UDP a partir d'un autre ordi super lent
    Par RaphAstronome dans le forum Ruby
    Réponses: 3
    Dernier message: 21/05/2007, 22h15
  2. Socket : UDP ou TCP
    Par lafracas dans le forum Développement
    Réponses: 2
    Dernier message: 10/04/2006, 22h43
  3. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  4. [Socket] Rafraichissement lent de l'image
    Par keil dans le forum Multimédia
    Réponses: 9
    Dernier message: 26/10/2005, 15h01
  5. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo