2017-02-10 9 views
-2

Я использую Java-сокеты (TCP, время ожидания чтения до 30 секунд) для связи с внешним сторонним сервером. Данные сервера представляют собой непрерывный поток, включающий пакеты конкретных приложений.Входной поток, связанный с сокетом, возвращает данные байтового значения 0

Но от последних нескольких дней входной поток возвращается данных, который представляет значение байта 0.

while (connectionIsValid){ 
final byte[] buffer= new byte[2]; 
in.read(buffer); 
    //Print buffer 
//Log line 
Byte[0] is 0 
Byte[1] is 0 

//POST processing if buffer bytes is not equal to OK. 
//Other wise bypass post processing 
} 

- Там не исключение logged.And как не связанного потока/сокета генерируется исключение Я знаю сокет Java клиент не закрыт/тайм-аут.

И приложение прорывается через цикл.

[Обновлено]

private byte[] readWrapper(InputStream stream, int totalLen) throws IOException { 
     byte[] buffer; 
     byte[] bufferingBuffer = new byte[0]; 
     while (totalLen != 0) { 
      buffer = new byte[totalLen]; 
      final int read = stream.read(buffer); 
      if(read==-1 || read==0){ 
       //throw exception 
      } 
      totalLen = totalLen - read; 
      buffer = ArrayUtils.subarray(buffer, 0, read); 
      bufferingBuffer = ArrayUtils.addAll(bufferingBuffer, buffer); 

     } 
     return bufferingBuffer; 
    } 
+1

Вы игнорируете значение, возвращаемое 'read()'. Поэтому любые выводы, которые вы делаете о содержимом буфера, недействительны. – EJP

+0

Да, я должен проверить/зарегистрировать значение, возвращаемое read(). Но как я установил время чтения из 30 секунд, не будет ли read() блокироваться в течение 30 секунд, пока не будут прочитаны 2 байта? Это мыслительный процесс, предполагающий, что 2 байта действительно читаются. – blueSky

+2

Нет, он будет блокироваться до тех пор, пока (a) не будет передан хотя бы один байт, (b) произойдет конец потока или (c) будет выбрано исключение. Все это четко указано в Джавадоке. Там нет ничего, что говорит, что он попытается заполнить буфер. – EJP

ответ

0

Вам не нужно все это. JDK уже содержит метод для этого:

private byte[] readChunkedData(InputStream stream, int size) throws IOException { 
    byte[] buffer = new byte[size]; 
    DataInputStream din = new DataInputStream(stream); 
    din.readFully(buffer); 
    return buffer; 
} 

Этой версия (а) работа (б) не требуют сторонних классов и (с) бросками EOFException если не size байт остаются в потоке ,

+0

Я видел этот метод, но если я хочу записать возвращаемое значение каждого read(), если значение <= 0. Поскольку я работаю с удаленным потоком, и мне было интересно, если read() возвращает 0 (если это -1 , поток закончился наверняка), и предположим, что я продолжу читать еще 100 итераций, я все равно получу данные! [link] (http://stackoverflow.com/questions/6160432/java-inputstream-reading-problem) – blueSky

+0

Прочтите это сообщение, и комментарий Алвина подразумевает, что даже если read() возвращает 0, может быть возможность получения данных в дальнейших итерациях. [link] http://stackoverflow.com/questions/6160432/java-inputstream-reading-problem – blueSky

+0

@ Алвин совершенно ошибается в этом. Javdoc для 'InputStream.read()' четко заявляет, что он блокируется, пока не будет передан хотя бы один байт, или конец потока, или исключение. Единственный способ, с помощью которого он может вернуть ноль, - это предоставить буфер нулевой длины или счетчик, который будет ошибкой программирования. Я дал вам рабочий код. Что происходит, когда вы это пробовали? – EJP

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