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

Entrée/Sortie Java Discussion :

[Socket] Récupérer chaine reçue (getInputStream)


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut [Socket] Récupérer chaine reçue (getInputStream)
    Salut à tous.

    Me voilà confronter à un problème que je n'arrive pas à résoudre malgré mes multiples recherches.

    J'ai réalisé une application client et une application serveur qui communiquent par socket.

    Cependant je n'arrive pas à récupérer la chaine que le serveur reçoit...

    J'utilise la fonction read().

    Comment, à partir de la ligne orange, récupérer ma chaîne ?

    Voici mon code de ma méthode recevoirMessage() :

    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
    		try {
    			this.entreeSocket = sockActive.getInputStream();
    			this.sortieSocket = sockActive.getOutputStream();
    			
    	        try {
    	            int b = 0;
    	            while (b != -1) {
    	              b = this.entreeSocket.read();
    	              System.out.println("chaine recue par le serveur ");
    	              b = -1;
    	            } // while
    	            System.out.println("Fin de connexion");
    	        	
    	          } // try
    	          catch (IOException ex)
    	          {
    	            // fin de connexion
    	            System.out.println("Fin de connexion : "+ex);
    	            ex.printStackTrace();
    	          }
    		}
    		catch(Exception e)
    		{
    		}

    Par avance, merci .

    Nicolas

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    1) utilise read(byte[]) afin de lire plus d'un byte à la fois
    2) convertit le tableau de byte en string en faisant par exemple new String(byteArray)


  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (b != -1) {
    	b = this.entreeSocket.read();
    	System.out.println("chaine recue par le serveur ");
    	b = -1;
    } // while
    Une lecture attentive de la javadoc à propos de la méthode InputStream.read() révèle que la fonction ne lit qu'un seul octet et le retourne sous forme d'entier ("Reads the next byte of data from the input stream").

    A noter qu'ici, la valeur (-1) ne signifie pas qu'on a atteint la fin du dernier bloc de données que l'émetteur a envoyé mais que la connexion tout entière s'est terminée, donc que la socket est déconnectée. Au passage, il n'y a d'ailleurs pas de notion de 'blocs de données' en TCP, c'est un flux continu d'octets et c'est à toi d'implémenter un mécanisme pour séparer chaque 'bloc'.


    Ce que tu cherches à faire se rapproche plus de la possibilité offerte par BufferedReader.readLine() qui lui gère la notion de blocs de données en considérant que le séparateur entre deux blocs est le retour chariot ('\n').

    De plus, quel est l'intérêt d'un tel 'while (b!=-1)' si tu faits un 'b = -1' dans la boucle elle-même ?

  4. #4
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut
    Vos deux solutions fonctionnent

    PS: J'avais oublié de virer le -1, c'était juste pour un test.

    Merci à vous.

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par Nicolas74 Voir le message
    Vos deux solutions fonctionnent
    Oui pour des petites chaines de caractère (et un peu de chance).

    Par contre, à partir du moment ou pour une raison ou une autre le réseau entre ton émetteur et ton récepteur décidera de fragmenter les paquets (par exemple si tu envoies une chaîne de plusieurs Ko de long), la solution de Pill_S te fera recevoir la chaîne de caractères comme si c'était plusieurs chaînes différentes envoyées à la suite. Attention à ça !

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut
    Merci pour la mise en garde. Je n'y avais pas pensé !

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

Discussions similaires

  1. [XL-2003] Récupérer chaines caractères séparées par des espaces
    Par toukii dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2009, 18h55
  2. [RegEx] Récupérer chaine entre séparateurs.
    Par winx dans le forum Langage
    Réponses: 2
    Dernier message: 09/03/2009, 15h43
  3. Récupérer chaine caractère entrée dans une box
    Par clem56 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/06/2008, 12h47
  4. Réponses: 2
    Dernier message: 17/08/2007, 14h44
  5. socket et in = service.getInputStream();
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 24/07/2007, 03h15

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