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

Will this remove, and only remove, selection keys which are ready to read data?

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

为此,我希望能够注销所有允许客户端输入的密钥,这会按预期工作吗?

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

非常感谢您的帮助,非常感谢!

In my program, I want to ensure last messages from my server are sent letting the clients know a shutdown was initiated, so I want to prevent more commands being accepted while allowing the selector loop to continue till all messages are finished sending.

To this end, I want to be able to deregister all keys allowing input from the clients, will this work as intended?

没有。它不会在线上向客户端发送任何内容,并且会阻止您检测通道上的进一步读取事件,因此它们将无限期地坐在那里打开。

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

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