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 :

BufferedReader readLine() ne s'arrête jamais


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut BufferedReader readLine() ne s'arrête jamais
    Hello les gens,
    Je fais face à un problème très ennuyeux, et je n'arrive pas à m'en dépêtrer.
    J'ai un client développé en java qui lit un flux en tcp émanant d'un serveur codé en vb6 il me semble (nous n'avons aucune spécs sur celui-ci)
    Nous avons mené des tests en interne (nous avons donc développé un programme serveur en java qui simule ce que devait réaliser le serveur vb6 cible) et bouzin marche.
    En essayant de tester avec le serveur cible on se retrouve face au problème suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    socket = new Socket(InetAddress.getByName(System
    					.getProperty(ConstantsC7CPIP.SYSTEM_C7CPIP_BVC_SERVER_IP)),
    					port/* , InetAddress.getByName("localhost"), port */);
    ...
    -> La connexion est bien établie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    //in est private static BufferedReader in;
    in = new BufferedReader(new InputStreamReader(
    					socket.getInputStream()));
    ...
    String message_distant = new String();
    logger.log(Level.INFO, "Le client est en attente de messages...");
    int operation = 0;
    while (/* operation == 0 && */operation != 99 && (message_distant = in.readLine()) != null) {
    //faire son boulot
    ...
    Avec le serveur en interne tout se passe bien (mais je me répète)
    Avec le serveur cible on n'arrive pas à sortir du in.readLine()
    Nous avons donc décidé d'essayer de lire en caractère par caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String chars = new String();
    int c;
    while ((c = in.read()) !=-1) {
    chars += (char) c;
    System.out.print((char) c);
    }
    System.out.println("message entier= " + chars);
    L'instruction System.out.print((char) c); affiche bien les caractères, cependant nous n'arrivons jamais à sortir de cette boucle j'en déduis que la condition relative au while ((c = in.read()) !=-1 n'est jamais vérifiée (perspicace) or les caractères du flux qui ont été affichés contiennent bien des retour chariot (CRLF)

    D’où peux provenir mon problème?
    Merci pour toutes vos contributions

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les méthodes readLine()/read() retournent null/-1 uniquement lorsque le flux est fermé.


    a++

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Un readLine() s'arrête soit quand il tombe sur une fin de ligne, soit quand il tombe sur la fin du stream. S'il ne s'arrête pas, c'est qu'aucune de ces situations n'arrive : ou bien il ne reçoit rien, ou bien ce qu'il reçoit n'est pas une fin de ligne.

    Je te suggère donc de douter que, comme tu le dis, vous recevez bien des CRLF quand vous lisez caractère par caractère. Ce n'est probablement pas le cas, ou alors le serveur envoie autre chose quand vous lisez caractère par caractère, que quand vous lisez par ligne (probablement d'autres différences dans le code que ce que tu montres.)

    Cela peut arriver aussi si vous avez un charset bizarre par défaut : les octets reçus seraient bien ceux d'un CRLF ASCII mais le reader, utilisant un charset incompatible ASCII, ne les reconnaîtrait pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    @adiGuba
    Merci pour ta réponse.
    Salut,


    Les méthodes readLine()/read() retournent null/-1 uniquement lorsque le flux est fermé.


    a++
    heu... non?
    String java.io.BufferedReader.readLine() throws IOException


    Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

    Renvois :
    A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
    Emissions :
    IOException - If an I/O error occurs

    int java.io.BufferedReader.read() throws IOException


    Reads a single character.

    Remplace : read() dans Reader
    Renvois :
    The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached
    Emissions :
    IOException - If an I/O error occurs
    @thelvin
    Merci pour ta réponse. Je penche pour l'histoire du charset incompatible. Demander à ce que l'envoi soit en binaire ? Quel puis-je y faire sinon ?

    Edit: j'ai trouvé ça:
    InputStream in = System.in;
    Charset charset = Charset.forName("UTF-8");
    InputStreamReader reader = new InputStreamReader(in, charset);
    Comment savoir quel charset ils utilisent ? (Ils ne savent pas)
    Avec leurs données lues copiées collées sur notepad++ j'ai Dos/Windows ANSI, le même format que nous utilisions pour nos tests en internes.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jadey Voir le message
    heu... non?
    C'est pourtant ce qui est indiqué dans le texte que tu as posté :
    A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
    Si tu attends un null (ou un -1 via read()), tu ne l'obtiendras que lorsque la socket sera fermé.


    a++

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    @adiGuba
    Ce n'est pas ce que je comprends en lisant la javadoc précitée.
    Je suis d'accord que en ce qui concerne readLine(), null n'est renvoyée qu'a la fin du stream.
    Cependant :
    Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
    Suggère que la méthode sert aussi à renvoyer une ligne sans pour autant que le flux soit terminé si en rencontre LF, CR ou encore CRLF.
    Dans mes tests en interne j'ai le souvenir d'avoir fait sur la partie serveur des:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    out.println("message1");
    out.flush();
    Thread.sleep(5000);
    out.println("message2");
    out.flush();
    Thread.sleep(5000);
    ...
    et les messages parvenaient et étaient traités à interval de 5 secondes.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jadey Voir le message
    Je suis d'accord que en ce qui concerne readLine(), null n'est renvoyée qu'a la fin du stream.
    C'est tout ce que j'ai dit : null est renvoyé lorsque le flux est fermé !

    Dans ton premier message, tu semblais t'étonner de ne pas sortir de la boucle et de ne pas recevoir de -1, mais c'est normal tant que le flux n'est pas fermé.



    Perso je m'orienterais plus vers le protocole de discussion que tu as mis en place.
    Comment fonctionne la discussion ? Qu'est-ce qui est envoyé par ton serveur ? Comment ?

    Attention également à bien flusher les données, sinon il est possible qu'elles ne soient pas réellement envoyé...


    a++

Discussions similaires

  1. [SSIS][SSMS][2k5] Le job ne s'arrête jamais
    Par clementratel dans le forum SSIS
    Réponses: 0
    Dernier message: 02/12/2008, 16h11
  2. le package ne s'arrête jamais ?
    Par Mathusalem dans le forum SSIS
    Réponses: 2
    Dernier message: 22/08/2008, 11h10
  3. [DOM] AJAX: le chargement de la page ne s'arrête jamais
    Par Amallric dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 20/07/2008, 11h05
  4. ventilos ne s'arrête jamais de tourner
    Par sweety107 dans le forum Composants
    Réponses: 9
    Dernier message: 02/09/2005, 16h27
  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