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()


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 26
    Points
    26
    Par défaut BufferedReader + ReadLine()
    Bonjour,
    tout d'abord le contexte:mon programme est un serveur http.
    Je cherche à recuperer l'ensemble d'une requete Http sous forme de String.
    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
     
    private Socket _socket;
     
        private String _rep;
        private int _port;
        private PrintStream _os;
        private BufferedReader _is;
        private Requete _requete;
        private MyHttpServlet _httpServlet;
     
    public Httpd(int port, String rep, Socket socket) throws Exception {
     
            _socket = socket;
            _port = port;
            _os = new PrintStream(_socket.getOutputStream());
            _is = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
            String temp=null;
            String r=null;
            while((temp=_is.readLine())!=null)
            {
                  System.out.println("temp="+temp);
                  r=r+temp;
             }
     
            _requete=new Requete(r);
        }
    Mon probleme:
    Mon serveur reste coincé dans la boucle.
    Pourtant les specifications de la methode readLine() indiquent bien que celle_ci renvoie null lorsque le tampon est vide.
    Il semble que les headers et le corps de la requête Http soient separés par une ligne vide ce qui pourrait être a l'origine de mon probleme. J'aurais aime pouvoir faire un read pour mettre le tout dans un tableau de byte pour voir mais je ne trouve pas de methodes adequates.

    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Citation Envoyé par javadoc
    readLine

    public String readLine()
    throws IOException

    Read 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.

    Returns:
    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
    Throws:
    IOException - If an I/O error occurs
    D'apres la javadoc, la methode readLine() renvoie null si on arrive à la fin du stream... je pense que la ligne vide ne correspond pas à la source de ton probleme.. si c'etait le cas, cela voudrais dire qu'il serait impossible de lire un flux comportant des lignes à blanc.

    la trace que tu as mis dans la boucle affiche quoi comme dernier caractere?
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Merci fabz de t'interesser à mon post qui n'attire pas les foules decidement.
    En ce qui concerne la trace, cela s'arrete précisement la ou devrait être placé la ligne vide d'apres les specs Http. En gros lors d'une requête Post la derniere ligne est la derniere ligne des headers soit
    content-lenth=38
    J'ai également tenter de boucler sur un DataInputStream et de coller tout ca dans un tableau de byte sans plus de résultats (toujours bloqué dans la boucle). Mais d'après les specs Http il semblerait que le navigateurs écrive deux fois sur le socket la deuxieme fois étant précisement pour ajouter le corps du message.
    Voila la je suis sec et je trouve rien sur mon ami google.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    public boolean ready()
    throws IOExceptionTell whether this stream is ready to be read. A buffered character stream is ready if the buffer is not empty, or if the underlying character stream is ready.
    Je ne sais pas si ça va t'aider mais moi j'avais a peu pres le meme soucis, avec cette methode tu peux savoir si ton buffer est vide ou pas!!!
    Maintenant l'autre solution c'est de connaitre la taille de ta requete pour pouvoir t'arreter a temps...

  5. #5
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut
    readLine() te renvoie null lorsque la connexion est couper et apparemment ton client reste connecter au serveur !!!

    normalement le protocole http fais ceci (en gros) :

    - client se connecte au serveur
    - client envoie des infos sur lui et de la page qu'il veux consulter
    - serveur récupère les infos
    - serveur envoie la page que le client a demander
    - serveur coupe la connexion

    en gros ca se passe comme ca... donc c'est au serveur de couper la connexion une fois qu'il a envoyer la page html, sinon la connexion reste établie et ta fonction readLine() ne te retourne pas null

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Oui merci a tous pour votre aide le probleme est resolu.
    Voila le source:
    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
     
    _rep=rep;
    		_socket=socket;
    		_port=port;
     
     
    		_os = new PrintStream(_socket.getOutputStream());
    		_is = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
    		boolean verif=false;
    		int longueur=0;
            char[] contenu;;
     
    		while (true) {
     
    		    _requete = _is.readLine();
    		    String [] decoupage=_requete.split(" ");
    		    System.out.println(_requete);
    		    if (decoupage[0].equals("GET") ) break;
    		    if (decoupage[0].equals("POST")) { 
    		        verif=true;
    		         //break;
    		    }
    		    //on recupere la valeur de la longueur du contenu si on est 
    		    //dans la methode POST
    		    if (verif && decoupage[0].equalsIgnoreCase("Content-Length:")) {
     
    		        longueur=Integer.parseInt(decoupage[1]);
    		        System.out.println(longueur);
     
    		    }
    		    //si on est dans la methode POST et que la ligne est vide 
    		    //alors c'est le debut du contenu
    		    if (verif && _requete.equals("")) {
     
    		        //init du tableau de char avec la longueur trouvee precedemment
    		        contenu=new char[longueur];
    		        System.out.println("Debut corps");
    		        //lecture du flux sur la longueur definie et stockage des infos
    		        //dans le tableau de char
    		        _is.read(contenu,0,longueur);
     
    		        //conversion du tableau de char en string 
    		        String param=new String(contenu);
     
    		        for (int i=0;i<longueur;i++) {
     
    				    System.out.println("TOTO :"+contenu[i]);
     
    				}
    		        System.out.println("Param : "+ param);
     
     
    		        break;
    		    }
     
    		}

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

Discussions similaires

  1. BufferedReader readLine() ne s'arrête jamais
    Par jadey dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 26/03/2014, 18h20
  2. While + BufferedReader + readLine() = manque la dernière ligne
    Par JulianMarley dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 25/11/2013, 14h49
  3. BufferedReader: danger de readline ?
    Par aurelienDC dans le forum Langage
    Réponses: 1
    Dernier message: 18/12/2010, 12h49
  4. BufferedReader readLine() :(
    Par javan00b dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/08/2009, 21h38
  5. BufferedReader readline bloquant
    Par piscou51000 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 07/04/2009, 21h57

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