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 :

methode readline de BufferedReader se bloque


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut methode readline de BufferedReader se bloque
    Bonjour,

    j'ai un programme client et un autre serveur qui communiquent en mode socket.
    le client envoie un message au serveur et ça marche.
    La réponse du serveur arrive aussi au client , je veux transformer le Stream au String mais ça bloque au niveau de la methode readLine, voici le code:


    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
    public static String fromStreamToString(InputStream inputStream) throws IOException
    	{
    	    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    	    StringBuilder out = new StringBuilder();
    	    String line  = null;
    	    try {
    	    	if (reader.ready()) {
    		    	while ((line = reader.readLine()) != null) { 
    			        out.append(line);
    			    }
    	    	}
    		} catch (IOException  e) {e.printStackTrace();}
     
    	    return out.toString();
    	}
    ça débloque quand le programme serveur ferme la connexion socket.

    merci.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Citation Envoyé par m3allem001 Voir le message
    ça débloque quand le programme serveur ferme la
    connexion socket.
    Qu'est-ce qui débloque ?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Tout cela me semble être un symptôme du fait que le serveur ne termine jamais de ligne, tout simplement. Du coup la dernière -et seule- ligne renvoyée, est connue quand la connexion se ferme.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Le serveur envoie bien un retour à la ligne?

    Aussi, le code de ton client là, une fois qu'il aura lu la ligne, il ne pourra plus rien faire avec le inputstream, car le reade que tu as construit au dessus a probablement mangé des paquets en trop, vu qu'il travaille avec un buffer. C'est bien ce comportement que tu veux (Lire une ligne puis fermer la socket)?.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    En fait, mon programme contient des threads y compris un qui fait appel à la méthode fromStreamToString pour transformer le stream lu par la socket en chaine de caractères pour être exploitée par d'autres threads.
    En mode debuggage, quand on arrive à la methode readline, la ligne de debuggage disparait et le thread concerné se bolque.

    NB:
    la connexion du socket doit être tjs établie.
    Le serveur qui est tjs en écoute renvoie sa réponse si et seulement si le client l'interroge, donc l'envoi des paquets du coté serveur est controllable .

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par m3allem001 Voir le message
    En fait, mon programme contient des threads y compris un qui fait appel à la méthode fromStreamToString pour transformer le stream lu par la socket en chaine de caractères pour être exploitée par d'autres threads.
    C'est bien d'essayer d'expliquer des trucs. Mais c'est pas clair ton histoire.
    Enfin, il y a peu de chances que ça ait un rapport avec le schmilblick. Bien entendu, il ne faut pas que plus d'un thread à la fois lise ta socket (ni écrive dedans d'ailleurs).

    Citation Envoyé par m3allem001 Voir le message
    la connexion du socket doit être tjs établie.
    Dans ce cas, comme l'a dit tchize_ ta méthode fromStreamToString() ne peut pas marcher.

    - Elle ne s'arrête que quand reader.readLine() renvoie null, c'est-à-dire quand la socket est fermée. Si tu dois t'arrêter avant que la socket soit fermée, ben... Arrête-toi sur d'autres conditions que sa fermeture -_-°.

    - Tu ne peux pas encapsuler l'InputStream avec BufferedReader puis réutiliser l'InputStream derrière. BufferedReader va lire des octets de l'InputStream et les garder dans son buffer, donc l'InputStream ne peut plus les donner et seul le BufferedReader peut le faire. Si tu ignores ça, les octets lus par le BufferedReader disparaissent, et donc le protocole est complètement cassé.

    Si l'InputStream ne donne que du texte, il faudrait l'encadrer du BufferedReader du début à la fin. C'est à dire que tu ne devrais pas garder l'InputStream et ne pas y accéder depuis la Socket. Passer uniquement par le BufferedReader, construit une seule fois et dès le début.
    Notamment, la méthode fromStreamToString() prendrait le BufferedReader en paramètre au lieu de le construire elle-même (puisqu'elle est appelée plusieurs fois et qu'il ne doit être construit qu'une seule fois.)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    merci pour vous tous.

    au lieu de j'ai directement rempli une file d'attente avec le contenu de line et comme ça le reste du programme exploite le flux intercepté.

    A+.

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

Discussions similaires

  1. methode READLINE() problème
    Par neeoo11 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/02/2011, 11h12
  2. Problème methode readline
    Par dark0502 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/03/2009, 22h52
  3. probleme avec la methode readline
    Par konguess dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/11/2007, 12h06
  4. Probleme avec la methode readLine()!
    Par thenightmare1985 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/10/2006, 20h00
  5. BufferedReader + ReadLine()
    Par mimil dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/05/2005, 20h01

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