# BufferedReader blockiert zu lange



## Soccertrash (17. Aug 2008)

Hallo zusammen,

ich habe mir per Sockets eine HTTP GET Anfrage gebastelt, die auch wunderbar funktioniert. 
Leider hängt die Schleife an der Stelle in.readLine() immer, obwohl schon die ganze Response des Servers gelesen wurde. Gibt es irgendein Zeichen, das das Ende einer HTTP Response wider gibt? Ein Webbrowser hängt ja auch nicht so lange... Und mein Programm wartet noch ca 5 bevor es weiter macht, obwohl eben die gesamte Antwort schon da ist 
Hier mein Code: 


```
while((line2=reader2.readLine())!=null){
			
			ret+=line2;
				
}
```

Habe kein soTimeout angegeben. 

Thx! [/code]


----------



## tuxedo (17. Aug 2008)

Ich weiß es nicht genau, aber ich tippe mal darauf dass der Webserver die Verbindung noch offen hält und dort das Timeout liegt.

Pack doch das ganze auslesen in einen Thread und lass den dort "zuende warten".

Oder: Eine korrekte HTML Seite sollte doch mit sowas wie "</html>" enden... Mach doch einfach danach ein in.close() ?

Kleiner Tipp: readLine() will immer eine ganze Zeile lesen. Wenn du auf read() umsteigst bist du da etwas flexibler und es wird noch immer blockiert bis ein Zeilenende detektiert wird. 

- Alex


----------



## Murray (18. Aug 2008)

Beim HTTP-Protokoll können auch mehrere Request/Response-Kombinationen nacheinander über die gleiche Connection übertragen werden; man sollte also nicht unbedingt erwarten, dass der Server die Verbindung nach dem ersten Response abbricht (das Verhalten sollte man aber erzwingen können, wenn als Client im HTTP-Header "Connection: close" mitgibt).
Wenn der Server im Response-Header das Feld "Content-Length" füllt, dann kann man so vorgehen:
1. Den Response-Header zeilenweise lesen (also solange zeilenweise lesen, bis eine Leerzeile kommt)
2. Dann im Header nach der Zeile mit "Content-Length" suchen und den Wert auswerten
3. Dann genau so viele Zeichen lesen, wie  lt. Server kommen sollen


----------



## Soccertrash (18. Aug 2008)

Also ich übergeb jetzt bei der Anfrage bei keep-alive den Wert 0 und bei Connection den Wert close und nun gehts viel schneller  Der Tipp mit Zeichenauslesen ist auch gut, nur wird der Wert nicht bei allen Anfragen mit übergeben... Und auf das schließende HTML kann man sich nicht verlassen, da ich z. B. auch AJAX Requests versende, in denen nur ein Stück "HTML" ist 
Danke für die Tipps!!!


----------



## HoaX (18. Aug 2008)

wieso machst du das alles überhaupt zu fuß wo es z.B. httpclient von apache gibt?


----------

