IOException глотается, когда входной сокет неожиданно закрыт
Этот фрагмент не работает, когда сокет неожиданно закрыт. нетIOException
брошен, и s.read()
никогда не вернется.
try {
while (!doneReading)
{ /* read blocks waiting for data */
int readResult = s.read(inBuf, inBufLength, 1);
...
}
}
catch (IOException err) { .. }
Когда сокет изначально закрыт, стек выглядит следующим образом:
Thread [Thread-10] (Suspended (exception SocketException))
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]
SocketInputStream.read(byte[], int, int, int) line: 150
SocketInputStream.read(byte[], int, int) line: 121
SocketInputStream.read(byte[]) line: 107
JavaSEPort$SocketImpl.readFromStream() line: 7462
JavaSEPort.readFromSocketStream(Object) line: 7601
Socket$SocketInputStream.read(byte[], int, int) line: 179
NetConn.runRead() line: 1044
NetConn.run() line: 989
Thread.run() line: 744
C:\java\jdk1.8.0\bin\javaw.exe (Dec 23, 2015, 4:47:53 PM)
исключение socketexception, по-видимому, перехватывается и перебрасывается как ioexception на этом этапе:
Thread [Thread-10] (Suspended (exception IOException))
owns: DualStackPlainSocketImpl (id=93)
DualStackPlainSocketImpl(AbstractPlainSocketImpl).available() line: 465 [local variables unavailable]
SocketInputStream.available() line: 238
JavaSEPort$SocketImpl.getAvailableInput() line: 7428
JavaSEPort$SocketImpl.readFromStream() line: 7452
JavaSEPort.readFromSocketStream(Object) line: 7601
Socket$SocketInputStream.read(byte[], int, int) line: 179
NetConn.runRead() line: 1044
NetConn.run() line: 989
Thread.run() line: 744
NetConn.run() line: 989
Thread.run() line: 744
Трудно сказать больше о том, что происходит, потому что источник для JavaSEPort не связан в среде eclipse
Дополнительная информация: я получил больше источников и вижу, что JavaSEPort.readFromStream перехватывает IOException и возвращает ноль. На несколько уровней выше, в Socket.read есть время (buffer==null), которое никогда не будет экранировано. Это полностью объясняет поведение - я вижу бесконечный цикл следов стека и чтение никогда не возвращается.
1 ответ
При возникновении ошибки вы должны получить connectionError
обратный вызов вместо исключения.