Erreur dans la lecture d'un flux réseau

Résolu
Tlash Messages postés 8 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 5 octobre 2007 - 4 oct. 2007 à 17:20
Tlash Messages postés 8 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 5 octobre 2007 - 5 oct. 2007 à 01:41
J'écris une API perso de connection HTTP, mais j'ai un problème avec la lecture de la réponse :

    public void open() throws StatusException, java.net.UnknownHostException, java.io.IOException{
        if (this.stat == Status.READY){
            try {
                this.socket = new java.net.Socket(this.request.getHost(), this.request.getPort());
                this.br = new java.io.BufferedReader(new java.io.InputStreamReader(this.socket.getInputStream()));
                this.pw = new java.io.PrintWriter(this.socket.getOutputStream(), true);
                this.pw.print(this.request.createHTTPRequest());
                this.pw.flush();
                String head = "";
                String body = "";
                while (true){
                    String str = br.readLine();
                    if (str.length() != 0){
                        head += str + "\n";
                    }
                    else {
                        break;
                    }
                }
                String str = br.readLine();
                if (str != null){
                    try {
                        for (int i=0; i<Integer.parseInt(str.trim(), 16); i++){
                            body += (char)br.read();
                        }
                    }
                    catch (NumberFormatException nfe){/*System.out.println(nfe);*/}
                }
                this.response = new HCResponse(head, body);
                this.stat = Status.OPEN;
            }
            catch (java.net.UnknownHostException uhe){
                this.stat = Status.ERROR;
                throw uhe;
            }
            catch (java.io.IOException ioe){
                this.stat = Status.ERROR;
                throw ioe;
            }
        }
        else {
            throw new StatusException("The open() method requires READY status.");
        }
    }

Je lis d'abord l'en-tête que je mets dans la variable head, puis je lis le nombre hexadécimal donnant la taille du corps de la réponse puis je lis autant de caractères que le corps en contient. Le nombre est toujours le même pour une même page, mais une fois sur deux il me manque un peu du bas de la page.
Je crois que c'est parce que parfois il essaye de lire un caractère qui n'est pas encore télécharger.
Comment faire pour palier à cela ?

Je peux aussi lire jusqu'à ce que br.readline() == null, dans ce cas-là j'ai la réponse en entier, mais il faut que je détecte et vire le "\r\n0\r\n" qui termine la réponse.

1 réponse

Tlash Messages postés 8 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
5 oct. 2007 à 01:41
En fait j'ai réussi a régler mon problème moi-même, il suffisait de remplacer le if par un while :

                String str = br.readLine();
                while (str != null){
                    try {
                        for (int i=0; i<Integer.parseInt(str.trim(), 16); i++){
                            body += (char)br.read();
                        }
                    }
                    catch (NumberFormatException nfe){/*System.out.println(nfe);*/}
                    str = br.readLine();
                }
3
Rejoignez-nous