gpt4 book ai didi

java - 取消选择键但之后重新使用它

转载 作者:行者123 更新时间:2023-12-01 11:26:16 24 4
gpt4 key购买 nike

我想首先向选择器注册一个 channel ,以便仅在连接时执行 select(),然后仅在写入时执行。

像这样:

SelectionKey key = server.register(selector, SelectionKey.OP_CONNECT);
server.connect(address);
int readyChannels = 0;
while (readyChannels == 0) readyChannels = selector.select(config.connectTimeout);
server.finishConnect();
key.cancel();

key = server.register(selector, SelectionKey.OP_WRITE);
// write something to the channel and check timeout
// with selector.select(config.writeTimeout)

但是,当我到达代码中的第二个 register(...) 时,我收到 CancelledKeyException

还有其他方法可以做到这一点吗?

正确的方法是每次都定义一个新的选择器吗?

附注我知道我可以使用 key.isWritable() 等。

最佳答案

  1. 如果 finishConnect() 返回 false,则像返回 true 一样继续操作是不正确的。

  2. 你的问题是你没有在取消和注册之间调用选择器,所以还有未完成的事情。这里最简单的解决方案是删除取消和注册,直接调整现有选择键的interestOps即可。

  3. 但是,由于您只是有效地阻塞直到连接完成,所以在阻塞模式下执行连接会更简单,然后再转到非阻塞,以便后续 I/哦:

    // Still in blocking mode, no register() yet ...
    server.socket().connect(address, connectTimeout);
    server.configureBlocking(false);
    key = server.register(selector, SelectionKey.OP_WRITE);

    ...注意到如果超时到期,则会引发异常。

实际上,我很少遇到在客户端中以非阻塞模式使用 NIO 有意义的情况。

关于java - 取消选择键但之后重新使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com