Biorąc pod uwagę ten fragment śledzenia stosu
Przyczyna: java.net.SocketException: oprogramowanie spowodowało przerwanie połączenia: błąd zapisu gniazda
w java.net.SocketOutputStream.socketWrite0 (metoda macierzysta)
Próbowałem odpowiedzieć na następujące pytania:
- Jaki kod zgłasza ten wyjątek? (JVM? / Tomcat? / Mój kod?)
- Co powoduje zgłoszenie tego wyjątku?
Odnośnie nr 1:
Źródło JVM firmy Sun nie zawiera dokładnie tego komunikatu, ale myślę, że tekst Oprogramowanie spowodowało przerwanie połączenia: błąd zapisu gniazda pochodzi z natywnej implementacji SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Odnośnie nr 2
Domyślam się, że jest to spowodowane przerwaniem połączenia przez klienta przed uzyskaniem pełnej odpowiedzi (np. Wysłał żądanie, ale przed otrzymaniem pełnej odpowiedzi został zamknięty / zakończony / offline)
Pytania:
- Czy powyższe założenia są prawidłowe (nr 1 i nr 2)?
- Czy można to odróżnić od sytuacji: „nie można pisać do klienta z powodu błędu sieciowego po stronie serwera ”? czy też spowoduje to wyświetlenie tego samego komunikatu o błędzie?
- I najważniejsze: czy istnieje oficjalny dokument (np. Firmy Sun) stwierdzający powyższe?
Muszę mieć dowód, że ten ślad stosu jest „winą” klienta gniazda i nie ma nic, co serwer mógłby zrobić, aby tego uniknąć. (z wyjątkiem przechwytywania wyjątku lub używania SocketOutputStream innej niż Sun JVM, chociaż oba nie pozwalają uniknąć faktu zakończenia pracy klienta)
outs.write(audioBytes);
) byte[]
do OutputStream
. Kiedy dźwięk jest odtwarzany i podczas odtwarzania, jeśli użytkownik kliknie jakiekolwiek inne menu (które wysyła żądanie serwera), otrzymałem ten sam błąd na konsoli. więc czy można bezpiecznie zignorować ten wyjątek?