# Server schließt einfach verbindung?



## Empire Phoenix (25. Okt 2010)

Warum bekomm ich bei folgenden code wenn das limit relativ niedrig ist oft timeouts? (RemoteHost closed connection)
Hat da irgetwer eine Idee?


```
URL weburl = new URL("to large file");
				URLConnection con = weburl.openConnection();
				con.setUseCaches(false);
				con.setDefaultUseCaches(false);
				in = weburl.openStream();
				out = new FileOutputStream(localfile);
				int filesize = new Integer(con.getHeaderField("content-Length"));
				int read = 0;
				while(read < filesize){
					long cur = System.currentTimeMillis();
					byte[] data = new byte[limit];
					int r = in.read(data);
					read += r;
					Gui.setProgress(this.webname + ": " + read/1000 + "kb /" + filesize/1000 + " kb",read*100/filesize);
					out.write(data, 0, r);
					long dif = System.currentTimeMillis()-cur;
					long sleep = 1000-dif;
					System.out.println(sleep);
					if(sleep > 0){
						Thread.sleep(sleep);
					}
					
				}
				out.close();
				in.close();
```


----------



## madboy (25. Okt 2010)

Kurze Antwort: weil du zu langsam liest 

Lange Antwort: Die Daten werden vom Betriebssystem bzw. dem Protokoll blockweise angefordert. Bedeutet, du liest aus einem Cache des Betriebssystems. Liest du zu langsam, fordert das BS erst nach einer zu langen Zeit einen neuen Block an, der Server denkt "der liest nicht mehr" und du bekommst ne Exception.


----------



## Empire Phoenix (25. Okt 2010)

deshalb hab ich ja die caches eigentliche extra deaktiviert , sollte das nicht helfen?

bzw gibt es im tomcat ne einstellung womit man die timeouts höher amchen kann?


----------



## madboy (25. Okt 2010)

Empire Phoenix hat gesagt.:


> deshalb hab ich aj die caches eigentliche xtra deaktiviert , sollte das nicht helfen?



Welche Caches hast du deaktiviert? 

Um es deutlicher zu machen: Angenommen, du kommunizierst über TCP/IP mit einer angenommenen "Blockgröße" von 1024 Byte und dein Java-Programm liest mit 1 Byte/Sekunde:

Dein Java-Programm fängt an, das erste Byte vom Server zu lesen und leitet die Anfrage an das OS weiter. Das OS wiederum fordert den ersten Block von 1024 Bytes an und legt ihn in einen Cache.

Dein Java-Programm liest 1 Byte, schläft 1 Sekunde, liest ein Byte, schläft 1 Sekunde usw.
Nach 1024 Sekunden hast du alles gelesen, was im Cache liegt und das OS muss erneut den Server nach einem Block fragen. Jetzt passiert der Timeout, da schon seit 1024 Sekunden nicht mehr mit dem Server kommuniziert wurde und dieser denkt, die Verbindung sei tot oder ähnliches.

Das alles ist wie gesagt nur das grobe Prinzip, wie es bei mir im Kopf hängen geblieben ist ;-) Details findest du aber bestimmt mittels Suchmaschine deiner Wahl.

EDIT: Tomcat? Liest du von deinem eigenen Server? Schreibst du einen Server?


----------



## Empire Phoenix (25. Okt 2010)

ich lese vom eigenen server
minimale downlaodrate ist 1kb/s


----------



## madboy (26. Okt 2010)

Um den Sessiontimeout von Tomcat erhöhen schlägt google unter anderem vor: Tomcat configuration  ChemAxon – toolkits and desktop applications for cheminformatics


----------



## Empire Phoenix (27. Okt 2010)

Hm ja der Sessiontimeout ist es aber nicht, der steht bei mir auf einer Stunde, das Problem kann ich aber in weniger als 5 Minuten reproduzieren.


----------

