这会删除并且只删除准备读取数据的选择键吗?

时间:2017-03-31 09:20:52

标签: java sockets selector nio

在我的程序中,我想确保发送来自我服务器的最后一条消息,让客户知道已启动关闭,所以我想阻止接受更多命令,同时允许选择器循环继续直到所有消息都完成发送。

为此,我希望能够取消注册允许客户输入的所有密钥,这是否可以按预期工作?

if (Thread.currentThread().isInterrupted()) {
    for (SelectionKey key : sel.keys()) {
        if (key.interestOps() == SelectionKey.OP_READ) {
            key.cancel();
        }
    }
}

非常感谢任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:0)

  

在我的程序中,我想确保发送来自我服务器的最后一条消息,让客户知道已启动关闭,所以我想阻止接受更多命令,同时允许选择器循环继续直到所有消息都完成发送。

     

为此,我希望能够取消注册允许客户输入的所有密钥,这是否可以按预期工作?

没有。它不会向网络上发送任何内容,它会阻止你在频道上发现更多的阅读事件,所以他们只会无限期地坐在那里。

您需要关闭这些渠道,这似乎是最明显的解决方案,除非您有待处理的输出或至少 shutdown 关联的套接字用于输入。

但这是一个非常奇怪的要求。在先前的响应仍处于待决状态时,客户端不应发送新请求。应用程序协议应该解决这个问题,而不是摆弄套接字。