# Hilfe, meine HttpURLConnection hängt manchmal.



## der_Ben (21. Feb 2008)

Um verschiedene Websites via http anzufordern nutze ich folgenden Code:

```
String buffer = "";
    HttpURLConnection myConnection = null;
    URL url = new URL("http://foo.bar:80/index.html");
    myConnection = (HttpURLConnection) url.openConnection();
    myConnection.setRequestMethod("GET");
    myConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; JVM)");
    myConnection.setRequestProperty("Pragma", "no-cache");
    myConnection.setReadTimeout(TIMEOUT);
    myConnection.connect();
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(myConnection.getInputStream()));
    do {
      buffer = reader.readLine();      
      if (buffer != null) {        
        read.append(buffer);
      }
    } while (buffer != null);    
    reader.close();
    myConnection.disconnect();
```

Meistens ist auch alles gut, aber manchmal hängt das ganze bei 

```
buffer = reader.readLine();
```
fest. Aber das dann auch nur manchmal, bei einem zweiten oder dritten Versuch funktioniert die Anfrage wieder.
Habe ich irgendwo Murks eingebaut oder irgendwas nicht beachtet?


----------



## Tobias (21. Feb 2008)

buffer.readLine() wartet, bis eine Zeile eingelesen ist und gibt diese dann zurück. Wenn der Server aber nichts zurückliefert, wartet der BufferedReader hier ewig, weil nie eine Zeile voll wird.

mpG
Tobias


----------



## der_Ben (21. Feb 2008)

Ja ok, leuchtet ein. Habe deswegen nun Testweise

```
buffer = reader.readLine();
```
gegen

```
buffer = String.valueOf((char)reader.read());
```
ausgetauscht. Nun sehe ich auch, dass ich durchaus etwas empfange, aber dennoch bleibt das ganze wieder an dieser Stelle hängen, bevor die HTML Seite komplett übertragen ist. Gibts es da noch etwas zu beachten?


----------



## Tobias (21. Feb 2008)

Naja, der BufferedReader muß ja auf irgendein Zeichen warten, dass ihm sagt, dass die Zeile voll ist - wahrscheinlich ein Zeilenumbruch. Kommt sowas auch an?

mpG
Tobias


----------



## Murray (22. Feb 2008)

Versuch mal, die Verwendung persistenter Connections abzuschalten:


```
myConnection.setRequestProperty("Connection", "close");
```

Hintergrund: Mit HTTP 1.1 wird die Connection normalerweise nach einem Response nicht geschlossen, sondern kann für den nächsten Request benutzt werden. Daher wird man beim Lesen des Response-Streams auch nicht null erhalten; die (blockierende) read-Methode wartet vielmehr auf die nächste Antwort (die aber niemals kommt). Schließt der Server die Verbindung aber, sobald er den Response komplett geschrieben hat, dann liefert die read-Methode wirklich wie hier erwartet null zurück.


----------



## Guest (27. Feb 2008)

Danke, danke... meine HttpURLConnection und ich vertragen uns derweil auch wieder.  :lol: 

Aber diesbezüglich habe ich da noch eine Frage:
Wie viele HttpURLConnection kann man eigentlich bedenkenlos in eigenen Threads "gleichzeitig" starten ohne die heimischen Internetleitung zu überlasten?! 


MfG
der Ben


----------



## tuxedo (27. Feb 2008)

Das kommt doch stark auf

a) die Internetverbindung
und
b) die größe der Webseite an.

Überleg dir einfach wieviele Webseiten du im Browser deiner Wahl gleichzeitig öffnen kannst ohne dass die Leitung qualmt.

Bei heutigen DSL-Anschlüssen dürften das _wirklich_ viele Seiten gleichzeitig sein. Denke du brauchst dir da keine große Gedanken zu machen. Außer du willst 100 oder mehr Seiten laden.

- Alex


----------



## der_Ben (28. Feb 2008)

Hmm... also manchmal könnten es schon 100 sein, u.U. auch mal 500 oder 1000... daher ja meine Nachfrage, um einen Wert zu finden auf wieviele gleichzeitige Threads ich das begrenzen sollte...


----------



## tuxedo (28. Feb 2008)

Man muss dazu sagen, dass Windows die Anzahl der gleichzeitigen TCP-Verbindungen auf glaub 10 Stück beschränkt (hatten wir schon mindestens 2 mal in diesem Forum, musst du mal suchen). 

Solange du das nicht änderst kannstz du auch 10 Millionen Threads starten (sofern es dein Speicher zulässt). 

Eine fixe Zahl wie "Mit DSL6000 kann man 100 Webseitebn gleichzeitig runterladen" lässt sich nicht festlegen. Wenn's nur Textseiten, ohne Grafiken sind und der Webserver gzip unterstützt, kannst du viel mehr runterladen als wenn du nur Webseiten hast die Bilder in der Größe von 11MegaPixel anbietet. 

In meinem FTP-Programm hab ich (benutze DSL6000) nicht mehr als 15 oder 20 Verbindungen gleichzeitig. Irgendwann machts auch keinen Sinn noch mehr einzustellen da die Bandbreite mit jedem neuen Thread wieder ein Stück weniger wird. Und irgendwann wirds so wenig dass es unter Umständen zu einem Timeout kommt.

Würde irgendwas zwischen 5 und 25 nehmen, abhängig von der verfügbaren Download-Bandbreite. Ist aber nur so ein "pi-mal-Daumen" Maß...

- Alex


----------



## der_Ben (28. Feb 2008)

Ok, danke...


P.S.: es handelt sich übrigens um eine Webcrawler Applikation, die in sehr kurzen Intervallen sehr up-to-date sein soll. Bei allen Verbindungen werden meist nur kleine Textdateien in der Größenordnung von 150 bis 350 Byte gelesen.
Also keine Angst haben: Du hast mir keine Tips für 'nen bösartigen Spam-Bot gegeben :!:


----------

