# Sockets und HTTP: Ende des Datenempfangs erkennen



## günther (10. Feb 2009)

Hallo,

woran erkenne ich das Ende beim einfachen Empfang des Quelltextes einer Webseite? Die wichtigen Codestellen sehen wie folgt aus:

```
Socket socket = new Socket(ip, port);
BufferedReader vomServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream zumServer = new PrintStream(socket.getOutputStream(), true);
```
Nachdem ich an einen bestimmten Server einen HTTP-Request gesendet habe, kann ich mit folgender Funktion die Antwort auch empfangen:


```
vomServer.readLine();
```
Diese liest ja immer nur eine Zeile, deshalb habe ich eine while-Schleife verwendet, die die Funktion mehrfach aufruft und erst abbricht, wenn der gelieferte String == null ist. Das funktioniert aber nicht, denn es wird dennoch weiter versucht, Daten zu empfangen, was natürlich letztendlich mit einem Fehler endet, da der Server ja bereits alles gesendet hat.

Wie muss die korrekte Abbruchbedingung lauten bzw. wie sieht die Standard-Schleifenkonstruktion in solchen Fällen aus?

Gruß,
günther


----------



## Chumax (10. Feb 2009)

fang den fehler ab und gut is


----------



## günther (10. Feb 2009)

Du meinst, es wird die IOException von readLine geworfen, sobald alles gesendet wurde? Das kommt mir etwas komisch vor, denn immerhin soll sich die readLine-Funktion ja laut Beschreibung wie folgt verhalten:


> Returns null if the end of the stream has been reached


Es handelt sich ja letztendlich auch nicht um eine Ausnahme, wenn der Server irgendwann fertig ist, sondern es steht ja von vornherein fest, dass es auf jeden Fall dazu kommen wird. Vielleicht habe ich dich aber auch ganz falsch verstanden.


----------



## HoaX (11. Feb 2009)

wenn du explizit einen http 1.0 request sendest sollte der server imho die verbindung am ende trennen. ansonsten bleibt dir nich die möglichkeit das headerfeld "Content-Length" auszuwerten. ansonsten schau ins rfc, wenn irgendwo was dazu steht, dann sicher dort.


----------

