2008-09-25 4 views
65

Ich habe nicht in der Lage gewesen, eine adäquate Antwort auf das, was genau der folgende Fehler bedeutet, zu finden:java.net.SocketException: Software hat Verbindungsabbruch verursacht: recv gescheitert

java.net.SocketException: Software caused connection abort: recv failed

Hinweise:

  • Dieser Fehler ist selten und unvorhersehbar; obwohl das Erzielen dieses Fehlers bedeutet, dass alle zukünftigen Anforderungen für URIs ebenfalls fehlschlagen.
  • Die einzige Lösung, die funktioniert (auch nur gelegentlich) ist, Tomcat und/oder die tatsächliche Maschine (Windows in diesem Fall) neu zu starten.
  • Der URI ist definitiv verfügbar (wie durch das Bitten des Browsers bestätigt).

Relevante Code:

BufferedReader reader; 
try { 
URL url = new URL(URI); 
reader = new BufferedReader(new InputStreamReader(url.openStream()))); 
} catch(MalformedURLException e) { 
throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream 

String buffer; 
StringBuilder result = new StringBuilder(); 
while(null != (buffer = reader.readLine())) { 
result.append(buffer); 
}//end while: Got the contents. 
reader.close(); 
+3

Hey. Sie haben die Antwort als richtig markiert - jede Chance, dass Sie sich daran erinnern, was Sie herausgefunden haben, indem Sie etwas schnüffeln? Dieses Problem hat mich erwischt. (Siehe meine Frage http://stackoverflow.com/questions/6772215/java-net-socketexception-software-caused-connection-abort-recv-failed-with-jav) –

+1

Ich habe auch dieses Problem. Die einzige Lösung besteht darin, den gesamten Rechner neu zu starten. Jeder hat eine vollständige Antwort? –

+0

@KevinWong Die Lösung besteht darin, das Netzwerk zu reparieren. – EJP

Antwort

21

Dies bedeutet normalerweise, dass ein Netzwerkfehler aufgetreten ist, z. B. ein TCP-Timeout. Ich würde anfangen, indem ich einen Schnüffler (Drahthai) auf der Verbindung platziere, um zu sehen, ob Sie irgendwelche Probleme sehen können. Wenn ein TCP-Fehler vorliegt, sollten Sie in der Lage sein, es zu sehen. Außerdem können Sie Ihre Router-Protokolle überprüfen, falls dies möglich ist. Wenn Wireless überall beteiligt ist, ist dies eine weitere Quelle für diese Art von Fehlern.

3

eine Verbindung zu http Daten? Können Sie die HttpClient-Bibliothek anstelle der Standardbibliothek verwenden? Die Bibliothek hat mehr Optionen und bietet bessere Fehlermeldungen.

http://hc.apache.org/httpclient-3.x/

4

Das einzige Mal, dass ich so etwas passieren gesehen habe, ist, wenn ich eine schlechte Verbindung haben, oder wenn jemand die Buchse endet, die ich von einem anderen Thread Kontext verwende.

2

Try ‚autoReconnect = true‘ zur jdbc-Verbindungszeichenfolge Hinzufügen

1

Dieser von Zeit zu Zeit passieren wird, entweder wenn eine Verbindung unterbrochen wird oder wenn eine Remote-Host beendet ihre Verbindung (geschlossene Anwendung, Herunterfahren des Computers, usw.) . Sie können dies vermeiden, indem Sie Sockets selbst verwalten und Verbindungsabbrüche in Ihrer Anwendung über ihr Kommunikationsprotokoll behandeln und dann shutdownInput und shutdownOutput aufrufen, um die Sitzung zu bereinigen.

1

Schauen Sie, ob Sie einen anderen Dienst oder ein Programm auf dem http-Port ausgeführt haben. Es ist mir passiert, als ich versuchte, den Port zu benutzen, und es wurde von einem anderen Programm übernommen.

0

Wenn Sie Netbeans verwenden Tomcat zu verwalten, versuchen HTTP-Monitor in Werkzeuge zu deaktivieren - Server

+0

Versuch es warum genau? – EJP

17

Dies geschieht auch, wenn Ihr TLS-Client nicht in der Lage ist, durch die erfordern Client-Authentifizierung konfigurierten Server authentifizieren werden.

+0

Nein, tut es nicht. Das bewirkt, dass der Server die Verbindung ordnungsgemäß mit einem TLS 'close_notify' schließt. Es wird überhaupt nicht zurückgesetzt oder die Verbindung wird im besten Fall durch Peer zurückgesetzt. – EJP

+0

Es ist mir mit einer API passiert, wenn die Authentifizierung fehlgeschlagen ist. Also danke @desbocages. – Eddy

+0

Dies war die Ursache für den Fehler mit meinem Apache-Setup – Atuos

0

Ich hatte auch dieses Problem. Meine Lösung war:

sc.setSoLinger(true, 10); 

COPY von einer Website -> Durch die setSoLinger() Methode verwenden, können Sie explizit eine Verzögerung einstellen, bevor ein Reset gesendet wird, mehr Zeit für die Daten geben lesen oder senden werden.

Vielleicht ist es nicht die Antwort für alle, aber für einige Leute.

+1

Das ist alles Unsinn. SO_LINGER macht so etwas nicht. Es steuert, wie lange 'close()' Blöcke für, wenn überhaupt. Es hat nichts mit dem Timing von Resets zu tun. Und "Kopieren von einer Website" ist keine angemessene Form der Zitierung. Sie sollten den Link angeben, damit wir sehen können, was er wirklich sagt, und wenn nötig, auch etwas dazu sagen. Ich weiß [woher du das hast] (http://www.davidreilly.com/java/java_network_programming/), und es ist Klasse A von Anfang bis Ende. Ich habe ihm vor etwa 15 Jahren eine Menge Korrekturen geschickt: Er hat einen Wutanfall bekommen und hat ihn seither nicht mehr aktualisiert. – EJP

5

Dieser Fehler tritt auf, wenn eine Verbindung abrupt geschlossen wird (wenn eine TCP-Verbindung zurückgesetzt wird, während noch Daten im Sendepuffer vorhanden sind). Die Bedingung ist sehr ähnlich zu einer viel häufiger "Verbindung durch Peer zurückgesetzt". Es kann sporadisch bei der Verbindung über das Internet passieren, aber auch systematisch, wenn das Timing richtig ist (z. B. mit Keep-Alive-Verbindungen auf localhost).

Ein HTTP-Client sollte nur die Verbindung erneut öffnen und die Anforderung erneut versuchen. Es ist wichtig zu verstehen, dass, wenn eine Verbindung in diesem Zustand ist, es keinen anderen Weg gibt, als sie zu schließen. Jeder Versuch, zu senden oder zu empfangen, wird denselben Fehler erzeugen.

Verwenden Sie nicht URL.open(), verwenden Apache-Commons HttpClient, die einen Wiederholungsmechanismus, Verbindungspooling, Keep-Alive und viele andere Funktionen hat.

Verwendungsbeispiel:

HttpClient httpClient = HttpClients.custom() 
      .setConnectionTimeToLive(20, TimeUnit.SECONDS) 
      .setMaxConnTotal(400).setMaxConnPerRoute(400) 
      .setDefaultRequestConfig(RequestConfig.custom() 
        .setSocketTimeout(30000).setConnectTimeout(5000).build()) 
      .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true)) 
      .build(); 
// the httpClient should be re-used because it is pooled and thread-safe. 

HttpGet request = new HttpGet(uri); 
HttpResponse response = httpClient.execute(request); 
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
// handle response ... 
+0

Nein, tut es nicht. Das verursacht "Verbindung zurückgesetzt durch Peer". Der Fehler des OP wird nicht durch Programmierung verursacht. – EJP

+0

Ja, tut es. Ich schlage vor, dass Sie etwas Forschung machen, bevor Sie eine -1 geben. Wir haben es tatsächlich getan. 'Verbindungszurücksetzung' wird durch das TCP-RST-Paket verursacht, aber wenn die TCP-RST empfangen wird, während noch Daten im Sendepuffer vorhanden sind, verursacht ein nachfolgendes 'recv()' aus der Anwendung einen 'WSAECONNABORTED'-Fehler, der in die Ausnahme in Frage. Ich frage mich, was * Ihre * Erklärung für diese Ausnahme ist. "Repariere das Netzwerk", sagst du - ich kann das auf localhost mit ein paar Codezeilen reproduzieren. – rustyx

+0

Sie fügen immer noch 'Verbindung zurücksetzen' mit 'Software verursachte Verbindungsabbruch' zusammen. Sie sind zwei verschiedene Bedingungen. – EJP

Verwandte Themen