在我的程序中,我想确保发送来自我服务器的最后一条消息,让客户知道已启动关闭,所以我想阻止接受更多命令,同时允许选择器循环继续直到所有消息都完成发送。
为此,我希望能够取消注册允许客户输入的所有密钥,这是否可以按预期工作?
if (Thread.currentThread().isInterrupted()) {
for (SelectionKey key : sel.keys()) {
if (key.interestOps() == SelectionKey.OP_READ) {
key.cancel();
}
}
}
非常感谢任何帮助,非常感谢!
答案 0 :(得分:0)
在我的程序中,我想确保发送来自我服务器的最后一条消息,让客户知道已启动关闭,所以我想阻止接受更多命令,同时允许选择器循环继续直到所有消息都完成发送。
为此,我希望能够取消注册允许客户输入的所有密钥,这是否可以按预期工作?
没有。它不会向网络上发送任何内容,它会阻止你在频道上发现更多的阅读事件,所以他们只会无限期地坐在那里。
您需要关闭这些渠道,这似乎是最明显的解决方案,除非您有待处理的输出或至少 shutdown 关联的套接字用于输入。
但这是一个非常奇怪的要求。在先前的响应仍处于待决状态时,客户端不应发送新请求。应用程序协议应该解决这个问题,而不是摆弄套接字。