2015-03-09 1 views
0
public static void waitUntil(String prompt, InputStream instr) { 
      while (true) { 

       try { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        if (instr.available() >= 5) { 
         byte[] buff = new byte[1024]; 
         int ret_read = 0; 
         ret_read = instr.read(buff); 
         if (ret_read > 0) { 
          if ((new String(buff, 0, ret_read)).contains(prompt) 
            && flag) { 
           break; 
          } 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }  

Если удалите это thread.sleep(1000) или даже я уменьшу до менее 1000, он не работает должным образом.Прочитайте входной поток сокета Java без thread.sleep() в приведенном ниже коде?

Вопрос: Как читать входной поток сокета java без thread.sleep() до того, как все входящие байты будут получены?

ответ

0
if (instr.available() >= 5) { 

Не делайте этого.

Вместо того, чтобы проверять, сколько байтов доступно, просто попробуйте прочитать некоторые в буфере.

Это будет заблокировано, пока не будет доступен хотя бы один байт, а затем возвратите столько, сколько есть (которые также вписываются в буфер).

Если это не возвращает все необходимые вам байты, проведите петлю до тех пор, пока вы их не получите.

Если вы просто хотите прочитать все, посмотрите эту тему: Convert InputStream to byte array in Java. Лично я использую Commons IO для этого.

0

Используйте DataInputStream.readFully() с размером буфера 5 (в данном случае, или, в целом, размером данных, который вы ожидаете), и избавитесь от теста сна и available().