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 :

Echange données client serveur via socket


Sujet :

API standards et tierces Android

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Echange données client serveur via socket
    Bonjour,

    J'avais réalisé une application pour échanger entre un serveur et un client (une app android) et ça fonctionne du tonnerre... jusqu'à ce que je fasse une modification, qui me rend l'échange complètement non opérationnel. Je suis revenu en arrière aussi loin que possible, mais rien à faire. Je tourne en rond impossible de trouver la cause.
    J'ai isolé au maximum et ça plante encore.
    Voici le code.

    Côté client:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    public void sendToServer(byte[] data) {
     
            /*
             * La classe permet de lancer un Thread tout en passant une variable en paramètre
             */
            class sendP implements Runnable {
     
     
                byte[] data;
                int status;
     
     
                /*
                 * Constructeur : permet de passer la liste des images en paramètre
                 */
                sendP(byte[] dat) {
                    data = dat;
                }
     
     
                /*
                 * Transfert des fichiers sur le serveur
                 */
                public void run() {
     
     
                    try {
     
     
                        Socket socket = new Socket(SERVER_ADDR, PORT);
     
     
                        DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
                        DataInputStream dIn = new DataInputStream(socket.getInputStream());
     
     
                        Log.v("[DEBUG]", "int en attente de lecture --> ça bloque ici");
                        status = dIn.readInt();
                        Log.v("[DEBUG]", "int lu --> quand le serveur ferme brutalement on y arrive");
     
     
                        if (status == 1) {
     
                            Log.v("[DEBUG]", "Valeur reçue");
                            dOut.writeInt(7);
                            dOut.flush();
     
     
                        } else {
                            Log.e("[ERROR]", "Le serveur n'a pas confirmé l'ouverture");
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    } 
                    finally 
                    {
     
                        snackbarconfirm.setDuration(3000);
                        snackbarconfirm.show();
     
     
                    }
                }
            }
     
     
            new Thread(new sendP(data)).start();
        }
    Coté serveur (je ne mets pas la classe qui lance treatClient(), elle n'a pas trop d'intérêt d'autant qu'elle n'a pas changé):

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import java.io.DataInputStream;import java.io.DataOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.Socket;
     
     
    public class treatClient {
     
     
        Socket client;
     
     
        public treatClient(Socket sock) {
              client = sock;
        }
     
     
        public void open() {
     
     
            Thread t = new Thread(new Runnable() 
            {
                public void run()
     
                {
     
                    int status = 0;
     
                    try {
     
     
                        DataInputStream stdIn = new DataInputStream(client.getInputStream());
                        DataOutputStream stdOut = new DataOutputStream(client.getOutputStream());
     
     
                        stdOut.writeInt(1);
                        stdOut.flush();
     
                                            // Un autre test pour fermer la connection. Le client envoie 7
                                            status = stdIn.readInt();
                        if (status == 7) 
                        {
                            System.out.println("Fin de la transmission cliente.");
                            stdIn.close();
                            stdOut.close();
                        }
     
     
     
                    } 
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            });
     
     
            t.start();
        }
    }
    Mais là, le client ne reçoit jamais 1. La connection est bien ouverte.
    En revanche, si je fermer le serveur brutalement, je reçois ma données au bout de 5 secondes à peu près...

    Avez-vous une idée de ce qui plante?
    Je me demande si ce n'est pas des mises à jours plus amont (android, serveur linux, box orange... ?)

    Merci d'une quelconque aide.

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Points : 690
    Points
    690
    Par défaut
    Bonjour,

    À quel moment tu fais appel à ta méthode open de la classe treatClient ?

    Juste une remarque, ce n'est pas pour ça que ton code fonctionne pas mais par convention le nom des classes commence par un majuscules.

    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

Discussions similaires

  1. Echange des données client/serveur, comment procéder ?
    Par shark59 dans le forum Réseau et multijoueurs
    Réponses: 7
    Dernier message: 17/05/2011, 20h26
  2. Réponses: 5
    Dernier message: 21/02/2010, 23h16
  3. lien client/serveur via socket
    Par erox44 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 08/12/2008, 08h54
  4. Réponses: 3
    Dernier message: 27/10/2008, 22h31
  5. Meilleur protocole pour echange de données client/serveur
    Par melcom_dev dans le forum Développement
    Réponses: 2
    Dernier message: 23/03/2005, 18h28

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