Может ли SelectionKey.isWritable быть истинным без OP_WRITE в InterestOps ()? - PullRequest
0 голосов
/ 19 сентября 2010

С учетом SelectableChannel c и его SelectionKey k, k.isWritable () возвращает, готов ли канал принимать вызовы write ().

Однако, может ли k.isWritable () вернуть значение true, если канал принимает записи, но OP_WRITE не задан в InterestOps?

Ответы [ 2 ]

1 голос
/ 19 сентября 2010

Нет, готовые операции - это подгруппа операций интереса. если ключ не заинтересован в записи, селектор не установит свою опцию готовности к записи (что не означает, что он не может принять запись. Вы можете вызывать write () в любое время. С write-ready запись ((), скорее всего, будет успешной, но там тоже нет гарантии)

0 голосов
/ 26 июля 2014

Есть одна уловка, на которую у меня уходит несколько часов.Рассмотрим следующий код:

SocketChannel socket = SocketChannel.open(new InetSocketAddress("127.0.0.1", 22));
socket.configureBlocking(false);
Selector selector = Selector.open();
SelectionKey selkey = socket.register(selector, 0);
....
selkey.interestOps(SelectionKey.OP_READ);
selector.select(1000);
System.out.println("Selecting r, return " +
  (selector.selectedKeys().contains(selkey) && selkey.isReadable() ? "r" : "") +
  (selector.selectedKeys().contains(selkey) && selkey.isWritable() ? "w" : ""));

Он печатает «Выбор r, возврат w».Таким образом, isWritable () может быть истинным, в то время как заинтересован только OP_READ.Это происходит, если OP_WRITE включен в предыдущий вызов select (), а текущий select () возвращает 0, что означает, что selkey ​​не обновляется.

Полный код подтверждения находится здесь: https://gist.github.com/wuyongzheng/43cc9dc07e13124663d1. Для запускавам нужен SSH сервер на порту 22.

...