代码之家  ›  专栏  ›  技术社区  ›  tstenner

如果没有op_write in interestops(),selectionkey.iswritable是否可以为true?

  •  0
  • tstenner  · 技术社区  · 14 年前

    给定selectablechannel c及其selectionkey k,k.iswritable()返回通道是否准备好接受对write()的调用。

    但是,如果通道接受写操作,但未在interestop中设置op_write,k.iswritable()是否可以返回true?

    2 回复  |  直到 10 年前
        1
  •  1
  •   irreputable    14 年前

    不,就绪操作是感兴趣的操作的子集。如果键对写不感兴趣,选择器将不会设置其写就绪操作(这并不意味着它不能接受写操作)。您可以随时调用write()。准备好写后,write()很可能会成功,但也不能保证成功)

        2
  •  0
  •   Wu Yongzheng    10 年前

    有一个陷阱,我花了几个小时才弄清楚。考虑以下代码:

    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 . 要运行,您需要在端口22上有一个ssh服务器。