Beim Versuch, aus einem Socket zu lesen, wird der folgende Fehler angezeigt. Ich mache readInt()
das InputStream
und bekomme diesen Fehler. In der Dokumentation wird darauf hingewiesen, dass der Client-Teil der Verbindung die Verbindung geschlossen hat. In diesem Szenario bin ich der Server.
Ich habe Zugriff auf die Client-Protokolldateien und die Verbindung wird nicht geschlossen. Die Protokolldateien deuten darauf hin, dass ich die Verbindung schließe. Hat jemand eine Idee, warum dies geschieht? Worauf sollte man noch achten? Tritt dies auf, wenn lokale Ressourcen möglicherweise Schwellenwerte erreichen?
Ich stelle fest, dass ich die folgende Zeile habe:
socket.setSoTimeout(10000);
kurz vor dem readInt()
. Es gibt einen Grund dafür (lange Geschichte), aber nur merkwürdig, gibt es Umstände, unter denen dies zu dem angegebenen Fehler führen könnte? Ich habe den Server in meiner IDE ausgeführt, und meine IDE blieb zufällig an einem Haltepunkt hängen. Dann bemerkte ich, dass genau dieselben Fehler in meinen eigenen Protokollen in meiner IDE angezeigt wurden.
Wie auch immer, ich erwähne es nur, hoffentlich kein roter Hering. :-(
quelle
Antworten:
Es gibt mehrere mögliche Ursachen.
Das andere Ende hat die Verbindung absichtlich zurückgesetzt, auf eine Weise, die ich hier nicht dokumentieren werde. Es ist selten und im Allgemeinen falsch, dass Anwendungssoftware dies tut, aber es ist für kommerzielle Software nicht unbekannt.
Häufiger wird es durch das Schreiben in eine Verbindung verursacht, dass das andere Ende bereits normal geschlossen wurde. Mit anderen Worten, ein Anwendungsprotokollfehler.
Dies kann auch durch Schließen eines Sockets verursacht werden, wenn sich ungelesene Daten im Socket-Empfangspuffer befinden.
In Windows wird "Software verursacht Verbindungsabbruch", was nicht mit "Verbindungsrücksetzen" identisch ist, durch Netzwerkprobleme verursacht, die von Ihrem Ende gesendet werden. Es gibt einen Microsoft Knowledge Base-Artikel dazu.
quelle
Das Zurücksetzen der Verbindung bedeutet einfach, dass ein TCP-RST empfangen wurde. Dies geschieht, wenn Ihr Peer Daten empfängt, die er nicht verarbeiten kann, und es kann verschiedene Gründe dafür geben.
Am einfachsten ist es, wenn Sie den Socket schließen und dann weitere Daten in den Ausgabestream schreiben. Durch Schließen des Sockets haben Sie Ihrem Kollegen mitgeteilt, dass Sie mit dem Sprechen fertig sind, und er kann Ihre Verbindung vergessen. Wenn Sie ohnehin mehr Daten in diesem Stream senden, lehnt der Peer diese mit einem RST ab, um Sie darüber zu informieren, dass er nicht zuhört.
In anderen Fällen kann eine dazwischenliegende Firewall oder sogar der Remote-Host selbst Ihre TCP-Verbindung "vergessen". Dies kann passieren, wenn Sie längere Zeit keine Daten senden (2 Stunden sind eine häufige Zeitüberschreitung) oder weil der Peer neu gestartet wurde und seine Informationen über aktive Verbindungen verloren hat. Das Senden von Daten über eine dieser nicht mehr funktionierenden Verbindungen führt ebenfalls zu einer RST.
Update als Antwort auf zusätzliche Informationen:
Schauen Sie sich Ihren Umgang mit dem genau an
SocketTimeoutException
. Diese Ausnahme wird ausgelöst, wenn das konfigurierte Zeitlimit überschritten wird, während ein Socket-Vorgang blockiert wird. Der Status des Sockets selbst wird nicht geändert, wenn diese Ausnahme ausgelöst wird. Wenn Ihr Ausnahmebehandler jedoch den Socket schließt und dann versucht, darauf zu schreiben, befindet sich die Verbindung zurück.setSoTimeout()
soll Ihnen eine saubere Möglichkeit bieten, aus einemread()
Vorgang auszubrechen, der andernfalls für immer blockieren könnte, ohne schmutzige Dinge wie das Schließen des Sockets von einem anderen Thread aus zu tun.quelle
Wenn ich solche seltsamen Probleme hatte, setze ich mich normalerweise mit einem Tool wie WireShark zusammen und schaue mir die Rohdaten an, die hin und her übertragen werden. Sie könnten überrascht sein, wo die Verbindung getrennt wird, und Sie werden nur benachrichtigt, wenn Sie versuchen, zu lesen.
quelle
Es ist peinlich, es zu sagen, aber als ich dieses Problem hatte, war es einfach ein Fehler, dass ich die Verbindung geschlossen habe, bevor ich alle Daten gelesen habe. In Fällen, in denen kleine Zeichenfolgen zurückgegeben wurden, funktionierte dies, aber das lag wahrscheinlich daran, dass die gesamte Antwort gepuffert wurde, bevor ich sie schloss.
Bei längeren Textmengen wurde die Ausnahme ausgelöst, da mehr als ein Puffer zurückkam.
Sie könnten nach diesem Versehen suchen. Denken Sie daran, dass das Öffnen einer URL wie eine Datei ist. Schließen Sie sie unbedingt (lösen Sie die Verbindung), sobald sie vollständig gelesen wurde.
quelle
Sie sollten die gesamte Spur sehr sorgfältig prüfen.
Ich habe eine Server-Socket-Anwendung und einen
java.net.SocketException: Connection reset
Fall behoben .In meinem Fall geschieht dies beim Lesen von einem clientSocket-
Socket
Objekt, dessen Verbindung aus irgendeinem Grund geschlossen wird. (Netzwerk verloren, Firewall oder Anwendung stürzt ab oder soll geschlossen werden)Eigentlich stellte ich die Verbindung wieder her, als beim Lesen von diesem Socket-Objekt ein Fehler auftrat.
Das Interessante ist,
for my JAVA Socket
wenn ein Client eine Verbindung zu my herstelltServerSocket
und seine Verbindung schließt, ohne dass sich irgendetwasis.read()
rekursiv anruft. Es scheint, dass Sie versuchen, aus einer geschlossenen Verbindung zu lesen, weil Sie sich in einer Endlosschleife zum Lesen von diesem Socket befinden. Wenn Sie für den Lesevorgang etwas wie das Folgende verwenden;Dann bekommst du eine stackTrace wie unten weiter und weiter
Ich habe nur ServerSocket geschlossen, meine Verbindung erneuert und auf weitere eingehende Clientverbindungen gewartet
Dadurch wird meine Verbindung für unbekannte Client-Socket-Verluste wiederhergestellt
Ich konnte keinen anderen Weg finden, weil Sie, wie Sie auf dem Bild unten sehen, nicht verstehen können, ob die Verbindung ohne a unterbrochen ist oder nicht
try and catch
, weil alles richtig zu sein scheint. Ich habe diesen Schnappschuss bekommen, während ichConnection reset
ununterbrochen war.quelle
Ich hatte den gleichen Fehler. Ich habe jetzt die Lösung für das Problem gefunden. Das Problem war, dass das Client-Programm beendet wurde, bevor der Server die Streams las.
quelle
Ich hatte dieses Problem mit einem in Java geschriebenen SOA-System. Ich habe sowohl den Client als auch den Server auf verschiedenen physischen Computern ausgeführt und sie haben lange Zeit einwandfrei funktioniert. Dann wurden diese unangenehmen Verbindungsrücksetzungen im Clientprotokoll angezeigt und im Serverprotokoll war nichts Seltsames. Ein Neustart von Client und Server hat das Problem nicht gelöst. Schließlich stellten wir fest, dass der Heap auf der Serverseite ziemlich voll war, und erhöhten den für die JVM verfügbaren Speicher: Problem gelöst! Beachten Sie, dass das Protokoll keinen OutOfMemoryError enthielt: Der Speicher war nur knapp und nicht erschöpft.
quelle
Überprüfen Sie die Java-Version Ihres Servers. Ist mir passiert, weil mein Weblogic 10.3.6 auf JDK 1.7.0_75 war, das auf TLSv1 war. Der Restendpunkt, den ich verwenden wollte, war das Herunterfahren von Daten unter TLSv1.2.
Standardmäßig hat Weblogic versucht, das stärkste gemeinsame Protokoll auszuhandeln. Weitere Informationen finden Sie hier: Probleme beim Festlegen der https.protocols-Systemeigenschaft für HTTPS-Verbindungen .
Ich habe eine ausführliche SSL-Protokollierung hinzugefügt, um das unterstützte TLS zu identifizieren. Dies zeigte an, dass TLSv1 für den Handshake verwendet wurde.
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.security.debug=access:stack
Ich habe dieses Problem behoben, indem ich die Funktion auf unser JDK8-kompatibles Produkt übertragen habe. JDK8 verwendet standardmäßig TLSv1.2. Für diejenigen, die auf JDK7 beschränkt sind, habe ich auch erfolgreich eine Problemumgehung für Java 7 getestet, indem ich auf TLSv1.2 aktualisiert habe. Ich habe diese Antwort verwendet: So aktivieren Sie TLS 1.2 in Java 7
quelle
Ich hatte auch dieses Problem mit einem Java-Programm, das versuchte, einen Befehl über SSH auf einem Server zu senden. Das Problem war, dass der Computer den Java-Code ausführte. Es war nicht berechtigt, eine Verbindung zum Remote-Server herzustellen. Die write () -Methode war in Ordnung, aber die read () -Methode löste eine java.net.SocketException: Verbindungsrücksetzung aus. Ich habe dieses Problem behoben, indem ich den Client-SSH-Schlüssel zu den bekannten Schlüsseln des Remoteservers hinzugefügt habe.
quelle
Nach meiner Erfahrung stoße ich häufig auf folgende Situationen:
Wenn Sie in einem Unternehmen arbeiten, wenden Sie sich an das Netzwerk- und Sicherheitsteam. Da bei Anfragen an externe Dienste möglicherweise eine Berechtigung für den entsprechenden Endpunkt erteilt werden muss .
Ein weiteres Problem ist, dass das SSL-Zertifikat möglicherweise auf dem Server abgelaufen ist, auf dem Ihre Anwendung ausgeführt wird.
quelle