2010-10-18 3 views
3

У меня возникло странное поведение сокетов. Я установил тайм-аут в 5 секунд, используя setSoTimeout. Это должно быть много времени в моей ситуации. Согласно онлайн-документации по java, необходимо выкинуть SocketTimeoutException, если он истечет. В нем также говорится, что сокет по-прежнему действителен. Поэтому я хочу поймать его, а затем продолжить. Однако вместо внутреннего улова внешний catch IOException улавливает искупление, и когда я вывожу в журнал данные, он говорит, что это SocketTimeoutException. Еще одно недоумение заключается в том, что я изменяю тайм-аут с 5 секунд, чтобы сказать, 15 секунд, и запишите количество времени, которое требуется для каждого чтения, времена всегда находятся в миллисекундах, никогда даже не приближаясь к секунде. Любые идеи ВЕЛИКОЕ оценили.Android - время разгона

ReadThread фрагмент кода

@Override 
public void run() 
{ 
    try 
    { 
     while (true) 
     { 
      byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE]; 

      int bytesRead = this.inputStream.read(sizeBuffer); 

      int length = 0; 

      for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++) 
      { 
       int bitsToShift = 8 * i; 
       int current = ((sizeBuffer[i] & 0xff) << bitsToShift); 
       length = length | current; 
      } 

      byte[] messageBuffer = new byte[length]; 


      this.socket.setSoTimeout(5000); //5 second timeout 

      try 
      { 
       this.inputStream.read(messageBuffer); 
      } 
      catch(java.net.SocketTimeoutException ste) 
      { 
       Log.e(this.toString(), "---- SocketTimeoutException caught ----"); 
       Log.e(this.toString(), ste.toString()); 
      } 

     } 
    } 
    catch (IOException ioe) 
    { 
     Log.e(this.toString(), "IOException caught in ReadThread"); 
     Log.e(this.toString(), ioe.toString()); 
     ioe.printStackTrace(); 
    } 
    catch (Exception e) 
    { 
     Log.e(this.toString(), "Exception caught in ReadThread"); 
     Log.e(this.toString(), e.toString()); 
     e.printStackTrace(); 
    } 

    this.interfaceSocket.socketClosed(); 

}// end run 

ответ

1

Исключение перехвачено в первой попытке поймать из-за раннего вызова this.inputStream.read(). У вас есть два из этих вызовов: один во внешней попытке, один во внутренней попытке.

Вы подтвердили, что данные считываются? Если данные считываются, вы должны ожидать, что операция чтения вернется через несколько миллисекунд. Если данные не читаются, операция чтения должна блокироваться там в течение указанного вами времени. Возможно, это связано с порядком, которым вы устанавливаетеSoTimeout (возможно, это поможет раньше).

Успехов, B-Rad

2

Я согласен с Брайаном. Вероятно, вы получаете таймаут при первом чтении, а не в секундах. Единовременный тайм-аут остается в силе до тех пор, пока вы его снова не измените.

Ваш второй запрос на чтение, в котором вы читаете «сообщение», кажется, предполагает (а), что он прочитает все сообщение, и (б), что он будет тайм-аут, если все сообщение не поступит в течение 5 секунд. Это не работает. Это будет таймаут, если ничего не прибывает в пределах 5 с, , иначе будет читать все, что прибыло, вплоть до message.length. Но это может быть только один байт.

Вы должны использовать DataInputStream.readFully(), чтобы прочитать все сообщение, и вам нужно полностью пересмотреть свою стратегию тайм-аута.

Смежные вопросы