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 :

Lire Données Socket android


Sujet :

API standards et tierces Android

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut Lire Données Socket android
    Bonjour,

    Je souhaite envoyer une trame au serveur et celui-ci doit me répondre s'il s'agit d'une trame correcte.

    Je ne sais pas trop comment m'y prendre... donc si vous pouviez me guider.

    J'ai une classe ClientThread pour la communication :
    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
    public class ClientThread extends Thread{
     
        private static final int SERVERPORT = 60115;
        private static final String SERVER_IP = "192.168.1.102";
     
        private Socket socket;
        private PrintWriter mBufferOut;
        private BufferedReader mBufferIn;
     
        public String message;
     
            @Override
            public void run()
            {
     
                try
                {
                    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                    socket = new Socket(serverAddr, SERVERPORT);
     
                    mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                    mBufferIn  = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
                    if( mBufferIn.readLine() != null)
                    {
                        message = mBufferIn.readLine();
                    }
     
                } catch (UnknownHostException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
     
            }
     
            public void envoyer(String message)
            {
                mBufferOut.print(message);
                mBufferOut.flush();
            }
     
    }
    Et ensuite l'endroit concerné ou j'attend la réponse :
    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
                        case R.id.buttonOK:
                            ThreadLAN.envoyer("#"+password+"#");
     
                            password += ThreadLAN.message;
                            /*if (ThreadLAN.message.length() <= 10)
                            {
                                password += ThreadLAN.message;
                            }*/
     
                            Intent main = new Intent(login.this, MainActivity.class);
                            main.putExtra(EXTRA_PASSWORD, password);
     
                            startActivity(main);
                            break;
     
                    }
    J'ai une variable message déclaré comme public et je vais la récupérer dans mon activité mais elle est null. Il me faudrait détecter à quel moment j'ai reçu une réponse mais je sais pas trop comment faire.

    Merci pour votre aide.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut
    Salut,

    Je ne suis pas vraiment un expert.

    De mon point de vue je définirai la class de ton thread dans ton activité (classe interne).
    Tu déclares ta variable dans ton activité, tu peux l'accéder depuis la classe interne.
    Le thread crée la socket, envoies et attend une réponse, tu peux stocker ta réponse dans "message" qui est partagé entre le thread et l'activité.
    Apres si tu veux tester si ta variable message est conforme je le ferais dans ton Listener.

    Tu peux toujours essayer de partager ta variable password entre ton thread et ton activité si tu préfères, sois tu l'ajoutes dans le constructeur soit tu définis ton thread dans une classe interne.


    Je me trompe peu être,

    Quel sont les rôles de password et de message ?





    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
     
    class CommunicationThread implements Runnable {
     
        private Socket socket;
        private String messageClient;
        private BufferedReader input;
        private PrintWriter output;
     
        public CommunicationThread(String messageClient) {
     
     
            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                this.socket = new Socket(serverAddr, SERVERPORT);
                this.messageClient = messageClient;
                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
                this.output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())), true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        public void run() {
     
            //envoie le message
            try {
                output.print(messageClient);
                output.flush();
                //attend la réception
                if (input.readLine() != null) {
                    //message, variable de ton activité, readLine() est bloquant
                    message = mBufferIn.readLine();
                }
                //lance ton activité
                launchActivity();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Ma classe Thread me sert dans deux activités...

    - une activité qui me sert de login
    - une activité qui est ma page principale

    Je suis obligé de relancer mon thread car il s’arrête quand je change d'activité...

    "password" est le mot de passe envoyé par le client et "message" le retour du serveur...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut
    Si tu veux conserver ton thread entre les 2 activités voient plutot de côté des services.

    Apres la version du "pauvre", tu recrées ton thread et le socket dans chacune des activités.

    J'ai du mal à cerner ton probleme.
    Concrètement si le serveur te répond, qu'est que cela doit changer dans ton activité ?

    Pour gérer la réponse tout ce déroule dans ton "input.readline()"
    Tu peux le faire dans un nouveau thread ou dans ton "ClientThread"

    Ce que tu peux faire c est implémenter un pattern observer/observable entre ton activité et ton thread.
    En cas de réception d'une réponse qui te convient tu notifie ton activité.
    Tu peux aussi passer un attribut de ton activité a ton thread lors de la création, par exemple un booléen, si tu recois une réponse tu changes sa valeur ...

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Je souhaite m'authentifier sur le serveur donc s'il me répond que c'est ok je quitte l'activité "login" pour charger l'activité principale...

    Je vais me renseigner sur les services... mais c'est quoi cette histoire de pattern observer/observable ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 6
    Par défaut
    Ce que je ferais a ta place:

    Dans ton activité login tu crées ta classe interne ThreadClient ...
    Tu crées une méthode launchActivity pour quitter ton activité login

    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
     
     
    class ThreadClient implements Runnable {
     
        private Socket socket;
        private String messageClient;
        private BufferedReader input;
        private PrintWriter output;
     
        public CommunicationThread(String messageClient) {
     
     
            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                this.socket = new Socket(serverAddr, SERVERPORT);
                this.messageClient = messageClient;
                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
                this.output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())), true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        public void run() {
     
            //envoie le message
            try {
                output.print(messageClient);
                output.flush();
                //attend la réception
                if (input.readLine() != null) {
                    //message, variable de ton activité, readLine() est bloquant
                    message = mBufferIn.readLine();
                    tu test si ton message te correspond
                   //lance ton activité
                    launchActivity();
                }
     
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    Dans ton activité

    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
     
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            .
            .
            .
            Thread t=new Thread(new ThreadClient(play,socket,currentVideo));
            t.start();
    }
     
    public void launchActivity(){
                            Intent main = new Intent(login.this, MainActivity.class);
                            main.putExtra(EXTRA_PASSWORD, password);
                            startActivity(main);
    }

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    T'as conception du thread n'est pas bonne à mon avis.

    Tu dois mettre en place une communication entre ton thread socket et ton thread principal (UI) via des handle. Voir : http://developer.android.com/trainin...nicate-ui.html

    Ensuite quand tu lance ton thread socket , celui ci reste dans le run au moyen d'une boucle infini et tu communique avec lui à l'aide de message.

    Perso j'aime bien utiliser HandlerThread : http://blog.nikitaog.me/2014/10/11/a...ndlerthread-i/
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Là en l'occurence, le thread est purement "one-shot" sequentiel (il doit s'arrêter en cas d'erreur ou de reception de la trame).

    Du coup, perso, je remplacerai Handler / Thread / messages par une simple AsyncTask (qui fait exactement celà: la gestion de la communication entre les différents threads).

    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
     
    class LoginActivity {
     
        class LoginTask extends AsyncTask....
         {
              doInBackground(...)
              {
                    la tringlerie des sockets
              }
     
              onPostExecute(...)
              {
                   LoginActivity.this.onLoginDone(...); // ou autre chose selon le retour de doInBackground
              }
         }
     
         public void onCreate(...)
         {
         }
     
         public void onXXXXXX() <= le truc qui lance le login
         {
               new LoginTask().execute(... des parametres ? ...);
         }
     
         public void onLoginDone(...)
         {
               // voilà on a le retour.... on fait ce qu'on veut dans le thread UI
         }
    }

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Bonjour et bonne année à vous tous !

    Merci pour toutes vos réponses. Malheureusement je ne peux pas les étudier pour le moment car je n'ai plus de PC ! Il me faut attendre

    Je reviens vers vous dès que possible.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut Retour !
    Bonjour,

    Je suis désolé de revenir presque 2 mois après mais j'ai repris mon problème et faut dire que je suis un peu perdu entre services, IntentService, AsyncTask, Handler, Thread+Service. Je ne sais plus trop quoi faire.

    En ce moment je regarde les services mais y a plein de gens qui apporte des solutions plus ou moins différentes sur leurs utilisations.

    Pour revenir au problème de base... j'ai deux activitées.

    - Une avec la page de login (je rentre mon mot de passe et le serveur me répond si oui ou non je suis autorisé)

    - si je suis autorisé --> la seconde activité ou j'envoi des commandes à mon serveur.

    Or le passage à la deuxième activité mon thread se relance. Donc finalement, quelle est la meilleur solution pour communiquer (réception/transmission) avec mon serveur sur deux activités ?

  11. #11
    Membre Expert
    Avatar de MathiasSeguy
    Homme Profil pro
    Fondateur Android2EE - Formation Expertise Android
    Inscrit en
    Avril 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fondateur Android2EE - Formation Expertise Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 185
    Billets dans le blog
    6
    Par défaut
    La meilleure solution est celle de grunk, le reste c'est des fuites mémoires. Donc t'as pas trop le choix montes en compétence avec les liens qu'il t'a fourni et implémente cette solution

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Par défaut
    Ok merci je vais étudier ça. C'est vrai que la notion de thread sur android j'ai un peu de mal.

    Mais j'aimerais comprendre un truc... il y a combien de thread UI ? Certe un seul mais le thread UI gère une activité ou est le même pour toutes les activités de mon appli ?

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    le thread dit "UI" est le thread principal de l'application.
    Il va gérer l'ensemble des activités et des services.

Discussions similaires

  1. [Système] Écrire / Lire flux socket SSL
    Par lem01 dans le forum Langage
    Réponses: 5
    Dernier message: 11/12/2006, 23h30
  2. lire données dans fichier txt
    Par flo456 dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2006, 08h01
  3. Réponses: 9
    Dernier message: 20/01/2006, 12h04
  4. [Excel] Lire données excel
    Par flopad dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 02/11/2005, 17h34

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