Java 将关键点添加到选定关键点集

Java 将关键点添加到选定关键点集,java,selector,nio,Java,Selector,Nio,我正在编写一个NIO服务器,并希望响应用户请求,即向通道写入一些数据 Selector selector; //... if(selector.selectNow() != 0){ if(key.isReadable()){ SocketChannel channel = key.channel(); //read some data //respond key.interestOps(SelectionKey.OP_WRI

我正在编写一个NIO服务器,并希望响应用户请求,即向通道写入一些数据

Selector selector;
//...
if(selector.selectNow() != 0){
    if(key.isReadable()){
        SocketChannel channel = key.channel();
        //read some data
        //respond
        key.interestOps(SelectionKey.OP_WRITE)
        //How to add the key to a selected set?
    }
}
在阅读了一些数据之后,我想做出回应。这意味着我需要将
OP_WRITE
添加到键中,然后将键添加到选定的键集,然后在键出现在选定的集中后将一些内容写入频道


如何将密钥显式添加到选定集?

您不能。从Javadoc:

不能将关键点直接添加到选定的关键点集

您只能从中删除密钥


但你不需要这些。如果要写入,只需写入,并且当且仅当写入返回零时,为OP_写入注册通道并返回select循环。当通道变为可写时,它将自动添加到选定的关键帧集。您不需要等待OP_WRITE完成初始写入。

您不能。从Javadoc:

不能将关键点直接添加到选定的关键点集

您只能从中删除密钥


但你不需要这些。如果要写入,只需写入,并且当且仅当写入返回零时,为OP_写入注册通道并返回select循环。当通道变为可写时,它将自动添加到选定的关键帧集。您无需等待OP_WRITE完成初始写入。

问题是我不太明白是谁将密钥添加到所选集。现在它看起来像是某种魔法。。。你能解释一下吗?这是操作系统的责任,而不是JVM吗?在
select()
期间,当它们注册的操作准备就绪时,键被添加到选择器设置的所选键。是的,我的问题不太正确。我的意思是JVM如何检测通道是否准备就绪?它是否依赖于实现/OS?操作系统中的TCP堆栈会检测到它。具体来说,当套接字接收缓冲区中有数据或EOS时,套接字变得可读,当套接字发送缓冲区中有空间时,套接字变得可写,这几乎总是正确的。问题是我不太明白是谁将密钥添加到所选集。现在它看起来像是某种魔法。。。你能解释一下吗?这是操作系统的责任,而不是JVM吗?在
select()
期间,当它们注册的操作准备就绪时,键被添加到选择器设置的所选键。是的,我的问题不太正确。我的意思是JVM如何检测通道是否准备就绪?它是否依赖于实现/OS?操作系统中的TCP堆栈会检测到它。具体来说,当套接字接收缓冲区中有数据或EOS时,套接字变得可读,当套接字发送缓冲区中有空间时,套接字变得可写,这几乎总是正确的。