Я использую 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;
}
Вы игнорируете значение, возвращаемое 'read()'. Поэтому любые выводы, которые вы делаете о содержимом буфера, недействительны. – EJP
Да, я должен проверить/зарегистрировать значение, возвращаемое read(). Но как я установил время чтения из 30 секунд, не будет ли read() блокироваться в течение 30 секунд, пока не будут прочитаны 2 байта? Это мыслительный процесс, предполагающий, что 2 байта действительно читаются. – blueSky
Нет, он будет блокироваться до тех пор, пока (a) не будет передан хотя бы один байт, (b) произойдет конец потока или (c) будет выбрано исключение. Все это четко указано в Джавадоке. Там нет ничего, что говорит, что он попытается заполнить буфер. – EJP