Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果不使用OP_WRITE in interestOps(),SelectionKey.isWritable是否为true?_Java_Nio - Fatal编程技术网

Java 如果不使用OP_WRITE in interestOps(),SelectionKey.isWritable是否为true?

Java 如果不使用OP_WRITE in interestOps(),SelectionKey.isWritable是否为true?,java,nio,Java,Nio,给定SelectableChannel c及其SelectionKey k,k.isWritable()返回该通道是否准备好接受对write()的调用 但是,如果通道接受写入,但操作写入未在InterestTops中设置,k.isWritable()能否返回true?否,就绪操作是兴趣操作的子集。如果key对write不感兴趣,选择器将不会设置其write ready op(这并不意味着它不能接受write。您可以随时调用write()。使用write ready,write()很可能会成功,但

给定SelectableChannel c及其SelectionKey k,k.isWritable()返回该通道是否准备好接受对write()的调用


但是,如果通道接受写入,但操作写入未在InterestTops中设置,k.isWritable()能否返回true?

否,就绪操作是兴趣操作的子集。如果key对write不感兴趣,选择器将不会设置其write ready op(这并不意味着它不能接受write。您可以随时调用write()。使用write ready,write()很可能会成功,但也不能保证成功)

有一个问题,我花了几个小时来解决。考虑下面的代码:

SocketChannel socket = SocketChannel.open(new InetSocketAddress("127.0.0.1", 22));
socket.configureBlocking(false);
Selector selector = Selector.open();
SelectionKey selkey = socket.register(selector, 0);
....
selkey.interestOps(SelectionKey.OP_READ);
selector.select(1000);
System.out.println("Selecting r, return " +
  (selector.selectedKeys().contains(selkey) && selkey.isReadable() ? "r" : "") +
  (selector.selectedKeys().contains(selkey) && selkey.isWritable() ? "w" : ""));
它打印“选择r,返回w”。因此,isWritable()可能为true,而只有OP_READ感兴趣。如果OP_WRITE包含在上一个select()调用中,而当前select()返回0,这意味着selkey没有更新,则会发生这种情况

完整的证明代码如下:。要运行,您需要在端口22处安装一个SSH服务器。

实际上它可以: 如果先设置OP_WRITE,则 关键字:0;
key.isWriteable()将返回true。

这是一个不同的问题,但在什么情况下(除了isWriteable()和write()之间的连接关闭之外)写入会失败/延迟?SelectionKey javadoc就是这么说的。