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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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);
    }

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