Anzeige:
Ergebnis 1 bis 10 von 10

Thema: java.net.SocketException: Connection reset

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23

    Unhappy java.net.SocketException: Connection reset

    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:

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

  2. #2
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23
    Wenn ich die Byte Anzahl heruntersetze kommt folgende Fehlermeldung:

    java.net.SocketTimeoutException: Read timed out

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Am besten du setzt erstmal kein eigenes Timeout, sowas ist immer weniger robust als normale TCP Timeouts.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23
    beim letzte ausführen hat b folgenden wert:

    [toString() unavailable - no suspended threads].

    Sagt das irgendjemanden was?

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    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:
    1. 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
    2. Du verwendest einfach eine schon vorhandene HTTPClient-Implementierung, bspw. -> diese hier <- aus dem Apache Project.

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    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...

  8. #8
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23
    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

  9. #9
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    In dem Fall würde ich zu Folgendem raten:

    Zitat Zitat von falke2203 Beitrag anzeigen
    Du verwendest einfach eine schon vorhandene HTTPClient-Implementierung, bspw. -> diese hier <- 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...

  10. #10
    Registrierter Benutzer
    Registriert seit
    04.09.2006
    Beiträge
    23
    Habe das Problem gefunden.
    Am Ende wurde auf Werte im Array zugegriffen, die nicht vorhanden waren. Überprüfe nun vorher die Arraylänge.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •