Если у Socket
есть связанный SocketChannel
, вы не можете напрямую читать с него InputStream
. Вы получите IllegalBlockingModeException
. Смотри здесь .
Вы можете заблокировать неблокирующие SocketChannels, зарегистрировав их в Selector и используя select () или select (long timeout) . Эти методы обычно блокируются, пока зарегистрированный канал не будет готов (или не истечет время ожидания).
Канал все еще не блокируется для потоков, не использующих селектор.
Модифицированный пример с здесь :
Selector selector = Selector.open();
channel.configureBlocking(false);
// register for OP_READ: you are interested in reading from the channel
channel.register(selector, SelectionKey.OP_READ);
while (true) {
int readyChannels = selector.select(); // This one blocks...
// Safety net if the selector awoke by other means
if (readyChannels == 0) continue;
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
keyIterator.remove();
if (!key.isValid()) {
continue;
} else if (key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel.
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
// a channel is ready for reading
} else if (key.isWritable()) {
// a channel is ready for writing
}
}
}