/ / Offizielle Gründe für "Software-verursachter Verbindungsabbruch: Socket-Schreibfehler" - Java, Ausnahme, Sockets, Tomcat, Stack-Trace

Offizielle Gründe für "Software verursacht Verbindungsabbruch: Socket-Schreibfehler" - Java, Ausnahme, Sockets, Tomcat, Stack-Trace

Angesichts dieses Stack-Trace-Snippets

Auslöser: java.net.SocketException: Software verursachte Verbindungsabbruch: Socket-Schreibfehler
beim java.net.SocketOutputStream.socketWrite0 (Native Methode)

Ich habe versucht folgende Fragen zu beantworten:

  1. Welcher Code löst diese Ausnahme aus? (JVM? / Tomcat? / Mein Code?)
  2. Wodurch wird diese Ausnahme ausgelöst?

Zu # 1:

Die JVM-Quelle von Sun enthält nicht genau diese Nachricht, aber ich denke, der Text Software verursacht Verbindungsabbruch: Socket-Schreibfehler stammt aus der nativen Implementierung von SocketOutputStream:

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;

In Bezug auf # 2

Ich vermute, dass es verursacht wird, wenn der Client hatDie Verbindung wurde beendet, bevor die vollständige Antwort abgerufen wurde (z. B. wurde eine Anforderung gesendet, aber bevor die vollständige Antwort abgerufen wurde, wurde die Verbindung geschlossen / beendet / offline geschaltet).

Fragen:

  1. Sind die obigen Annahmen korrekt (Nr. 1 und Nr. 2)?
  2. Kann dies von der Situation abweichen: "Konnte aufgrund eines Netzwerkfehlers auf dem nicht auf den Client schreiben Server Seite "? oder würde das die selbe Fehlermeldung ausgeben?
  3. Und am wichtigsten: Gibt es ein offizielles Dokument (z. B. von Sun), in dem das oben Gesagte aufgeführt ist?

Ich muss einen Beweis haben, dass diese Stapelspur ist"Fehler" des Socket-Clients, und es gibt nichts, was der Server hätte vermeiden können (außer das Abfangen der Ausnahme oder die Verwendung eines nicht von Sun stammenden JVM-SocketOutputStream), obwohl beide die Tatsache, dass der Client beendet wurde, nicht wirklich umgehen )

Antworten:

47 für die Antwort № 1

"Dieser Fehler kann auftreten, wenn das lokale NetzwerkDas System bricht eine Verbindung ab, z. B. wenn WinSock eine hergestellte Verbindung schließt, nachdem die erneute Datenübertragung fehlgeschlagen ist (der Empfänger bestätigt niemals Daten, die über einen Datenstrom-Socket gesendet wurden). " Dieser MSDN-Artikel. Siehe auch Einige Informationen zu "Software verursachte Verbindungsabbruch".


9 für die Antwort № 2

Ich habe dies am häufigsten gesehen, wenn eine Unternehmensfirewall auf einer Workstation / einem Laptop im Weg ist und die Verbindung abbricht.

z.B. Ich habe einen Serverprozess und einen Clientprozess auf demselben Computer. Der Server überwacht alle Schnittstellen (0.0.0.0) und der Client versucht, eine Verbindung zur öffentlichen / Heimschnittstelle herzustellen (beachten Sie nicht die Loopback-Schnittstelle 127.0.0.1).

Wenn das Netzwerk der Maschine getrennt ist (z. B. WLAN ausgeschaltet), wird die Verbindung hergestellt. Wenn das Gerät mit dem Unternehmensnetzwerk verbunden ist (direkt oder über VPN), wird die Verbindung hergestellt.

Wenn das Gerät jedoch an eine öffentliche Einrichtung angeschlossen istWiFi (oder Heimnetzwerk), dann wird die Verbindung von der Firewall unterbrochen. In dieser Situation funktioniert das Verbinden des Clients mit der Loopback-Schnittstelle einwandfrei, nur nicht mit der Home / Public-Schnittstelle.

Hoffe das hilft.


4 für die Antwort № 3

Um zu beweisen, welche Komponente ausfällt, würde ich die TCP / IP-Kommunikation mit überwachen Wireshark und schauen, wer den Port tatsächlich schließt, auch Timeouts könnten relevant sein.


3 für die Antwort № 4

Das java.net.SocketException wird ausgelöst, wenn beim Erstellen oder Zugreifen ein Fehler auftritt eine Steckdose (sowie TCP). Dies kann normalerweise verursacht werden, wenn der Server die Verbindung beendet hat (ohne sie ordnungsgemäß zu schließen), bevor die vollständige Antwort eingeht. In den meisten Fällen kann dies entweder durch das Timeout-Problem verursacht werden (z. B. die Antwort dauert zu lange oder der Server ist mit den Anforderungen überlastet) oder der Client hat die SYN gesendet, aber keine ACK erhalten (Bestätigung des Verbindungsabbruchs). Bei Timeout-Problemen können Sie den Timeout-Wert erhöhen.

Die Socket-Ausnahme wird normalerweise mit der angegebenen Detailmeldung zu dem Problem geliefert.

Beispiel für detaillierte Nachrichten:

  • Software verursacht Verbindungsabbruch: Recv fehlgeschlagen.

    Der Fehler weist auf einen Versuch hin, die Nachricht zu senden, und die Verbindung wurde von Ihrem Server abgebrochen. Wenn dies während der Verbindung zur Datenbank passiert ist, kann dies mit der Verwendung zusammenhängen nicht kompatibler Connector / J JDBC-Treiber.

    Mögliche Lösung: Stellen Sie sicher, dass Sie die richtigen Bibliotheken / Treiber in Ihrem CLASSPATH haben.

  • Software verursachter Verbindungsabbruch: Verbinden.

    Dies kann passieren, wenn ein Problem bei der Verbindung zur Fernbedienung auftritt. Zum Beispiel aufgrund der Virenprüfung die Remote-Mail-Anfragen abzulehnen.

    Mögliche Lösung: Überprüfen Sie, ob der Virus Scan-Dienst den Port für ausgehende Verbindungsanfragen blockiert.

  • Software verursacht Verbindungsabbruch: Socket-Schreibfehler.

    Mögliche Lösung: Stellen Sie sicher, dass Sie die richtige Länge von Bytes in den Stream schreiben. Überprüfen Sie also noch einmal, was Sie senden. Sieh dir das an Faden.

  • Verbindung von Peer zurückgesetzt: Socket-Schreibfehler / Verbindung von Peer abgebrochen: Socket-Schreibfehler

    Die Anwendung hat nicht überprüft, ob die Verbindung zum Keep-Alive-Server eine Zeitüberschreitung aufweist.

    Mögliche Lösung: Stellen Sie sicher, dass HttpClient nicht null ist, bevor Sie von der Verbindung lesen.E13222_01

  • Verbindung von Peer zurückgesetzt.

    Die Verbindung wurde vom Peer (Server) beendet.

  • Verbindung zurücksetzen.

    Die Verbindung wurde entweder vom Client beendet oder vom Server aufgrund einer Anfrage mit der Anfrage beendet.

    Sehen: Was verursacht meine java.net.SocketException: Verbindung zurückgesetzt?


2 für die Antwort № 5

Haben Sie den Tomcat-Quellcode überprüft? und die JVM-Quelle? Das kann dir mehr helfen.

Ich denke, Ihr allgemeines Denken ist gut. Ich würde ein erwarten ConnectException In dem Szenario, in dem Sie keine Verbindung herstellen konnten. Das oben Gesagte scheint sehr clientgesteuert zu sein.


2 für die Antwort № 6

Wenn Sie einfache Client Server-Programme verwenden und diese Fehlermeldung erhalten, liegt das Problem bei nicht geschlossenen (oder zu frühen) Eingabe- oder Ausgabestreams.


1 für die Antwort № 7

Ich hatte das gleiche Problem.
Häufig Diese Art von Fehler tritt auf, weil der Client seine Verbindung geschlossen hat und der Server immer noch versucht, auf diesen Client zu schreiben.
Stellen Sie also sicher, dass Ihr Client seine Verbindung geöffnet hat, bis der Server mit seinem Outputstream fertig ist.
Und noch eine Sache, vergessen Sie nicht Eingabe- und Ausgabestrom schließen.

Hoffe das hilft.
Und wenn Sie immer noch vor einem Problem stehen, erläutern Sie Ihr Problem hier ausführlich.


0 für die Antwort № 8

Dieser Fehler ist mir beim Testen meines SoapUI-Dienstes mit dem SoapUI-Client passiert. Im Grunde habe ich versucht, eine sehr große Nachricht (> 500 KB) zu erhalten, und SoapUI hat die Verbindung durch Timeout geschlossen.

Auf SoapUI gehen Sie zu:

Datei -> Einstellungen - Socket Timeout (ms)

... und setzen Sie einen großen Wert wie 180000 (3 Minuten), dies wird nicht die perfekte Lösung für Ihr Problem sein, da die Datei tatsächlich zu groß ist, aber Sie werden zumindest eine Antwort haben.


0 für die Antwort № 9

In meinem Fall war der Fehler:

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

Es wurde in Eclipse beim Debuggen eines Java empfangenAnwendung auf eine H2-Datenbank zugreifen. Die Ursache des Fehlers war, dass ich die Datenbank ursprünglich mit SQuirreL geöffnet hatte, um die Integrität manuell zu überprüfen. Ich habe das Flag verwendet, um mehrere Verbindungen zur gleichen Datenbank zu aktivieren (d. H. AUTO_SERVER=TRUE), so gab es kein Problem mit der Verbindung zur DB von Java.

Der Fehler trat auf, wenn nach einer Weile --es a istlanger Java-Prozess - Ich habe beschlossen, SQuirreL zu schließen, um Ressourcen freizugeben. Es scheint, als wäre SQuirreL derjenige, der die DB-Server-Instanz "besitzt" und der mit der SQuirreL-Verbindung heruntergefahren wurde.

Beim Neustart der Java-Anwendung wurde der Fehler nicht erneut gemeldet.

Konfig

  • Windows 7
  • Eklipse Kepler
  • SQuirreL 3.6
  • org.h2.Driver Version 1.4.192

-1 für die Antwort № 10

Mein Server hat diese Ausnahme in den letzten 2 Tagen ausgelöst und ich habe sie behoben, indem ich die Verbindungsunterbrechungsfunktion verschoben habe mit:

outputStream.close();
inputStream.close();
Client.close();

Bis zum Ende des Listing-Threads. ob es jemandem helfen wird.


-1 für die Antwort № 11

In der unten erläuterten Situation wird vom Client eine solche Ausnahme ausgelöst:

Der Server wird aufgefordert, den Client zu authentifizierenZertifikat, aber der Client stellt ein Zertifikat bereit, das von Extended Key Usage nicht unterstützt wird. Daher akzeptiert der Server das Clientzertifikat nicht und schließt dann die Verbindung.


-3 für die Antwort № 12

Ich hatte das gleiche Problem mit wireMock, als ich die restlichen API-Aufrufe verspottete. Früher habe ich den Server folgendermaßen definiert:

WireMockServer wireMockServer = null;

Aber es sollte wie folgt definiert werden:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);