Angesichts dieses Stack-Trace-Snippets
Auslöser: java.net.SocketException: Software verursachte Verbindungsabbruch: Socket-Schreibfehler
bei java.net.SocketOutputStream.socketWrite0 (native Methode)
Ich habe versucht, folgende Fragen zu beantworten:
- Welcher Code löst diese Ausnahme aus? (JVM? / Tomcat? / Mein Code?)
- Was bewirkt, dass diese Ausnahme ausgelöst wird?
Zu # 1:
Die JVM-Quelle von Sun enthält nicht genau diese Nachricht, aber ich denke, der Text, den die Software verursacht hat, hat den Verbindungsabbruch verursacht: Der Socket-Schreibfehler stammt von 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 dies verursacht wird, wenn der Client die Verbindung beendet hat, bevor die vollständige Antwort erhalten wurde (z. B. eine Anfrage gesendet, aber bevor die vollständige Antwort erhalten wurde, wurde sie geschlossen / beendet / offline).
Fragen:
- Sind die obigen Annahmen korrekt (Nr. 1 und Nr. 2)?
- Kann dies von der Situation unterschieden werden: "konnte aufgrund eines Netzwerkfehlers auf der Serverseite nicht auf den Client schreiben "? oder würde das die gleiche Fehlermeldung darstellen?
- Und das Wichtigste: Gibt es ein offizielles Dokument (z. B. von Sun), in dem dies angegeben ist?
Ich brauche einen Beweis dafür, dass diese Stapelverfolgung der "Fehler" des Socket-Clients ist, und es gibt nichts, was der Server hätte tun können, um dies zu vermeiden. (außer das Abfangen der Ausnahme oder die Verwendung eines SocketOutputStream, der nicht von Sun JVM stammt, obwohl beide die Tatsache, dass der Client beendet wurde, nicht wirklich vermeiden)
outs.write(audioBytes);
) byte[]
in OutputStream
. Wenn Audio läuft und während der Wiedergabe, wenn der Benutzer auf ein anderes Menü klickt (das eine Serveranforderung sendet), wird auf der Konsole der gleiche Fehler angezeigt. Ist es also sicher, diese Ausnahme zu ignorieren?