Я использую функцию для чтения байтов из неблокирующего 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);
}
I также не прочтет ничего, если что-то будет готово через мгновение. Как я могу различить guish, если я получил 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);
}