sockets sockets - java.net.SocketException:Software hat Verbindungsabbruch verursacht:recv ist fehlgeschlagen



example beispiel (9)

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 es einen TCP-Fehler gibt, 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.

Diese Frage hat hier bereits eine Antwort:

Ich konnte keine angemessene Antwort darauf finden, was genau der folgende Fehler bedeutet:

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

Anmerkungen:

  • 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 (auch nur gelegentlich) funktioniert, ist das Neustarten von Tomcat und / oder der tatsächlichen Maschine (in diesem Fall Windows).
  • Der URI ist definitiv verfügbar (wie durch das Bitten des Browsers bestätigt, den Abruf durchzuführen).

Relevanter 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();

Zugriff auf 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/


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 (zB bei Keep-Alive-Verbindungen auf localhost).

Ein HTTP-Client sollte die Verbindung einfach 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 Sie Apache-Commons HttpClient mit einem Wiederholungsmechanismus, Verbindungspooling, Keep-Alive und vielen anderen Funktionen.

Beispielverwendung:

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 ...

Überprüfen Sie, ob auf dem http-Port ein anderer Dienst oder ein anderes Programm ausgeführt wird. Es ist mir passiert, als ich versuchte, den Port zu benutzen, und es wurde von einem anderen Programm übernommen.


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

sc.setSoLinger(true, 10);

KOPIEREN VON EINER WEBSEITE -> Mit der Methode setSoLinger() können Sie explizit eine Verzögerung festlegen, bevor ein Reset gesendet wird. setSoLinger() gibt mehr Zeit für das Lesen oder Senden von Daten.

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


Fügen Sie 'autoReconnect = true' zur jdbc-Verbindungszeichenfolge hinzu


Das einzige Mal, dass so etwas passiert, ist, wenn ich eine schlechte Verbindung habe oder wenn jemand den Socket schließt, den ich aus einem anderen Thread-Kontext verwende.


Wenn Sie Netbeans zum Verwalten von Tomcat verwenden, versuchen Sie, den HTTP-Monitor in Tools - Servers zu deaktivieren


Ich habe nur ein Szenario, in dem das Erfassen eines OutOfMemoryError sinnvoll erscheint und zu funktionieren scheint.

Szenario: In einer Android-App möchte ich mehrere Bitmaps in höchstmöglicher Auflösung anzeigen und möchte sie flüssig zoomen.

Wegen des fließenden Zoomens möchte ich die Bitmaps im Speicher haben. Android verfügt jedoch über Speicherbeschränkungen, die geräteabhängig und schwer zu steuern sind.

In dieser Situation kann OutOfMemoryError beim Lesen der Bitmap vorhanden sein. Hier hilft es, wenn ich es fange und dann mit geringerer Auflösung weitermache.





java sockets