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

Android Discussion :

Probleme de reception de flux inputStreamReader


Sujet :

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
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Par défaut Probleme de reception de flux inputStreamReader
    Bonjour,
    Je me tourne vers vous car j'ai fait un petit programme qui se contente juste de récupérer des données envoyées par un serveur.
    Le client sur l'appareil android n'est chargé que d'afficher ce qu'il reçoit du serveur.
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    public class SlimpleTextClientActivity extends Activity {
     
        private TextView textView;
        private Socket client;
        private PrintWriter printwriter;
        private BufferedReader bufferedReader;
     
        //Following is the IP address of the chat server. You can change this IP address according to your configuration.
        // I have localhost IP address for Android emulator.
        private String CHAT_SERVER_IP = "192.168.2.2";
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_slimple_text_client);
            textView = (TextView) findViewById(R.id.textView1);
     
            ChatOperator chatOperator = new ChatOperator();
            chatOperator.execute();
     
        }
     
        /**
         * This AsyncTask create the connection with the server and initialize the
         * chat senders and receivers.
         */
        private class ChatOperator extends AsyncTask<Void, Void, Void> {
     
            @Override
            protected Void doInBackground(Void... arg0) {
                try {
                    client = new Socket(CHAT_SERVER_IP, 6666); // Creating the server socket.
     
                    if (client != null) {
                        printwriter = new PrintWriter(client.getOutputStream(), true);
                        InputStreamReader inputStreamReader = new InputStreamReader(client.getInputStream());
                        bufferedReader = new BufferedReader(inputStreamReader);
                    } else {
                        System.out.println("Server has not bean started on port 4444.");
                    }
                } catch (UnknownHostException e) {
                    System.out.println("Faild to connect server " + CHAT_SERVER_IP);
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("Faild to connect server " + CHAT_SERVER_IP);
                    e.printStackTrace();
                }
                return null;
            }
     
            /**
             * Following method is executed at the end of doInBackground method.
             */
            @Override
            protected void onPostExecute(Void result) {
                Receiver receiver = new Receiver(); // Initialize chat receiver AsyncTask.
                receiver.execute();
     
            }
     
        }
     
        /**
         * This AsyncTask continuously reads the input buffer and show the chat
         * message if a message is availble.
         */
        private class Receiver extends AsyncTask<Void, Void, Void> {
     
            private String message;
     
            @Override
            protected Void doInBackground(Void... params) {
                while (true) {
                    try {
     
                        if (bufferedReader.ready()) {
                            message = bufferedReader.readLine();
                            publishProgress(null);
     
                        }
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
     
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ie) {
                    }
                }
            }
     
            @Override
            protected void onProgressUpdate(Void... values) {
                textView.append( message + "\n");
            }
        }
    }
    Mon problème est que le client ne voit les messages envoyés au serveur que quand le serveur se déconnecte.
    Je m'explique, j'envois des messages du serveur, rien ne se passe sur mon UI, une fois que je déconnecte le servuer (proprement ou pas) la file des messages reçus par l'appareil s'affiche sur L'interface.
    Je n'arrive pas à comprendre pourquoi l'UI ne se met pas à jour..
    C'est vraiment rageant parce que le client reçoit les messages.

    Si quelqu'un a une idée je suis preneur !
    Simon

  2. #2
    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
    Heu....

    Comme on ne sait pas quelle est la gestion du flux TCP en amont, difficile de dire.
    Sans doute manque-t-il un flush ?

    Sinon, j'ai vu passer un Thread.sleep dans le code... et Thread.sleep() c'est le mal (indique dans 95% des cas qu'on a fait une erreur de conception).


    Et sinon, pour le coup, pas sur que les AsyncTask soient nécessaires dans le code... en particulier le "receiver" qui devrait (à mon avis) être un thread à part entière.
    L'idée de AsyncTask est de réaliser une "tâche" (donc "finie" dans le temps).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Par défaut
    Je n'ai pas accès au serveur.
    Le serveur envoie des données entre des balises <STX>datas; datas;datas;<ETX>
    Mon problème est que je ne récupère les données qu'à la déconnexion du serveur.
    Y a t il un moyen pour que je puisse ajouter un "\n" à une réception de message ?
    Ou bien utiliser autre chose que .readLine(), qqc qui récupère directement les messages à leur arrivée, sans vérification de caractère de fin de chaîne ?

  4. #4
    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
    oui, ne pas utiliser readLine()

    Oui je sais c'est idiot comme réponse, mais bon, c'est pas l'unique fonction disponible des streams ... entre read() tout court, et toutes les autres fonctions....

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Par défaut
    Bon j'ai essayé autre chose, un truc justement avec read()
    Mon code de test de récupération de la trame est le suivant (oui je suis repassé sur du co:
    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
     
    public class MainClass {
       public static void main(String[] args) throws Exception {
    	    final Socket client;
     
          InputStream is = null; 
          InputStreamReader isr = null;
          BufferedReader br = null;
     
          try{
        	  client = new Socket("192.168.2.2", 6666);
     
              InputStreamReader inputStreamReader = new InputStreamReader(client.getInputStream());
     
     
             // create new buffered reader
             br = new BufferedReader(inputStreamReader);
     
             int value=0;
             String monChar = null;
             String maChaine = null;
             //System.out.println(maChaine);
     
             // reads to the end of the stream 
             while((value = br.read()) != -1)
             { 
     
            	 // converts int to character
     
            	 char c = (char) value;
            	 maChaine = maChaine + c;
     
     
            	 //maChaine = maChaine + monChar;
     
                // prints character
     
     
             }
     
          }catch(Exception e){
             e.printStackTrace();
          }finally{
     
             // releases resources associated with the streams
             if(is!=null)
                is.close();
             if(isr!=null)
                isr.close();
             if(br!=null)
                br.close();
          }
       }
    }
    Bon maintenant c'est que j'arrive pas à récupérer la chaîne de char en entier. Si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                 System.out.println(maChaine);
    a l'interieur de mon while ça affiche à chaque tour de boucle, si je la mets juste après, rien ne se passe tant que le serveur est co', ce qui revient à mon problème initial....

  6. #6
    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
    il faudrait déjà connaitre la "marque" de fin de message... si ce n'est pas le CR (ou LN), ce doit être autre chose...

    Par exemple simplement un caractère 0

    (c'est un exemple hein !)

    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
     
    StringBuilder msgBuilder = new StringBuilder(); // <= oui on évite String = String + char qui fait des créations de builders automatiques en java.
    boolean ended = false;
    while (!ended) {
        int nextChar = stream.read();
        if (nextChar == -1) {
            ended = true; // <= fin du stream
        } else if (nextChar == 0) {
            // fin du message
            out.println(msgBuilder.toString());
            // on réinitiliase le builder
            msgBuilder.setLength(0);
        } else {
            msgBuilder.append((char)nextChar);
        }
    }

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/07/2006, 10h11
  2. Réponses: 3
    Dernier message: 12/07/2006, 15h56
  3. Probleme de surcharge de flux
    Par BigBeni dans le forum C++
    Réponses: 20
    Dernier message: 01/05/2006, 19h10
  4. Problème de reception parametre dans script sh
    Par lolo_ici_et_la dans le forum Linux
    Réponses: 1
    Dernier message: 05/01/2006, 17h55
  5. Réponses: 4
    Dernier message: 02/06/2005, 13h08

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