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 обратный вызов вместо исключения.

Другие вопросы по тегам