Я использую функцию для чтения байтов из неблокирующего SocketChannel (сокет из accept()) и из блокирующего SocketChannel (на стороне клиента). Я реализую сервер, используя селектор для обработки нескольких клиентов, и я использую петлевой адрес, чтобы использовать только свой ноутбук. я написал это
while((r = socketChannel.read(ackBuf)) != -1) {
System.out.println(name3d+" r: "+r);
}
и я ожидал, что когда будет достигнут конец контента в канале, read() вернет -1, но это не то, что будет успешным. read(), в неблокирующей конфигурации возвращает 0 также, если в данный момент ничего не готово для чтения, но это будет скоро (если я хорошо понимаю), поэтому, если я изменю код на
while((r = socketChannel.read(ackBuf)) > 0) {
System.out.println(name3d+" r: "+r);
}
Не буду ничего читать и если что-то будет готово через мгновение. Как я могу отличить, получил ли я 0, потому что не готов или потому что он закончился? В следующем фрагменте я могу проверить чтение во второй раз после сна, но я уверен, что это не надежный способ сделать то, что я хочу.
int times = 0;
while((r = socketChannel.read(ackBuf)) != -1 && times<2) {
if (r == 0)
try {
Thread.sleep(500);
times++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name3d+" r: "+r);
}