BufferedReader blockiert zu lange

Status
Nicht offen für weitere Antworten.

Soccertrash

Mitglied
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:

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

Habe kein soTimeout angegeben.

Thx! [/code]
 
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
 
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
 
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!!!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben