PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java.net.SocketException: Connection reset



susan.kasten
10-10-2006, 12:34
Hallo,

ich frage Dateien über einen Server ab. Es funktioniert alles wunderbar, nur beim lesen kommt dann irgendwann diese Fehlermeldung:

java.net.SocketException: Connection reset

Für Dateien von einem anderen Server mache ich es genauso und es funktioniert einwandfrei. Sind vielleicht 1414 Zeilen zu viel?

Der Code sieht folgendermaßen aus:



try {
Socket sock = new Socket(url, config.getPort());
OutputStream out = sock.getOutputStream();
InputStream in = sock.getInputStream();
sock.setSoTimeout(60000);

//GET-Kommando senden
String s = "GET " + adr + " HTTP/1.1" + "\r\n";
s = s + "Host: " + url + "\r\n";
s = s + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7" + "\r\n" + "\r\n";

out.write(s.getBytes());

OutputStream fileOut = new FileOutputStream(file);

int len;
byte[] b = new byte[100000];
try{
while ((len = in.read(b)) != -1) {
if(b != null)
fileOut.write(b, 0, len);
}
}
catch (Exception e)
{
System.out.println(e.toString());
}

out.close();
in.close();
fileOut.close();
return true;
}
catch(java.net.UnknownHostException e)
{
errorLog.write(url + "(einzel) : " + e.toString());
}
catch (MalformedURLException e) {
errorLog.write(url + "(einzel) : " + e.toString());
}
catch (SocketTimeoutException e)
{
errorLog.write(url + "(einzel) : " + e.toString());
return false;
}
catch (IOException e) {
errorLog.write(url + "(einzel) : " + e.toString());
}
return true;
}


Kann mir hier jemand weiterhelfen? Vielleicht auch, wie ich das Einlesen der Datei schneller gestalten kann. Es dauert so schon ganz schön lange.

Danke

susan

susan.kasten
10-10-2006, 12:42
Wenn ich die Byte Anzahl heruntersetze kommt folgende Fehlermeldung:

java.net.SocketTimeoutException: Read timed out

anda_skoa
10-10-2006, 13:18
Am besten du setzt erstmal kein eigenes Timeout, sowas ist immer weniger robust als normale TCP Timeouts.

Ciao,
_

susan.kasten
10-10-2006, 13:21
Das habe ich auch schon probiert, dass ich den Timeout wegnehme. Das Problem tritt genau dann auf, wenn er eigentlich das letzte Mal in.read(b) ausführt.

susan.kasten
10-10-2006, 13:24
beim letzte ausführen hat b folgenden wert:

[toString() unavailable - no suspended threads].

Sagt das irgendjemanden was?

falke2203
11-10-2006, 07:58
Vorab:

User-Agent faken ist IMO nur bedingt guter Stil
In deinem letzten Posting ist das mit Sicherheit nicht der Wert von b, sondern von der Exception.

Zu deinem eigentlichen Problem: In Abhängigkeit von der Server-Implementierung wird diese Schleife niemals terminieren (weshalb dir das auch so langsam vorkommt), da bei HTTP 1.1 (im Gegensatz zu HTTP 1.0) die Option besteht, Verbindungen auch nach Übertragung des Response offen zu halten. Dein read() wartet also bis in alle Ewigkeit (respektive bis zu einem Timeout vom Server) auf weitere Daten. Whatever, ich würde dir zwei Alternativen vorschlagen wollen, um mit diesem Problem umzugehen:

Du liest mal die HTTP 1.1 Spec (RFC 2616 wenn mich nicht alles täuscht, einfach mal googlen) und implementierst dir einen Client gemäß dieser Spezifikation
Du verwendest einfach eine schon vorhandene HTTPClient-Implementierung, bspw. -> diese hier <- (http://jakarta.apache.org/commons/httpclient/) aus dem Apache Project.

falke2203
11-10-2006, 08:00
Nachtrag: In deiner aktuellen Implementierung schreibst du den kompletten Response Content inkl. Header in eine Datei. Ich kann mir nicht vorstellen, dass das das ist, was du eigentlich beabsichtigst...

susan.kasten
11-10-2006, 08:39
Danke dir erst mal für deine Informationen. Es stimmt tatsächlich, eigentlich brauche ich nur einen Teil des Response. Habe dieses Projekt selber nur von einem ehemaligen Kollegen übernommen und kämpfe jetzt mit den Bugs und den Laufzeiten.

Leider muss ich gestehen, dass ich in der Netentwicklung noch nicht wirklich Erfahrungen gesammelt habe und von daher auch nicht weiß, wie ich es besser mache.

Falls du hier noch einen Tipp hast, wäre ich dir sehr dankbar.

Danke.

susan

falke2203
11-10-2006, 08:57
In dem Fall würde ich zu Folgendem raten:


Du verwendest einfach eine schon vorhandene HTTPClient-Implementierung, bspw. -> diese hier <- (http://jakarta.apache.org/commons/httpclient/) aus dem Apache Project.

Damit dürftest du, da es sich scheinbar um ein kommerzielles Projekt handelt, die time-to-market deutlich verkürzen (Lizenzbestimmungen beachten!).

Ansonsten führt tatsächlich kein Weg daran vorbei, dass du dich mit der Spezifikation eines Protokolls auseinandersetzt, wenn du dafür einen Client implementieren willst. Allgemeine Tipps kann ich dir dazu sonst nicht geben (außer vielleicht google, ob jemand schon mal das gleiche Problem hatte und wie er es gelöst hat *g*), wenn du aber noch konkrete Fragen hast oder haben wirst, versuche ich gerne diese zu beantworten...

susan.kasten
11-10-2006, 16:01
Habe das Problem gefunden.
Am Ende wurde auf Werte im Array zugegriffen, die nicht vorhanden waren. Überprüfe nun vorher die Arraylänge.