【发布时间】:2015-02-10 08:42:01
【问题描述】:
我一直在关注this tutorial,它很有帮助,而且大多数事情都很有意义。
如果您查看第 34 页,您会看到以下 sn-p 代码:
} else if ((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ) {
// Read the data
SocketChannel sc = (SocketChannel)key.channel();
// ...
}
这里到底发生了什么,单个 & 表示两个条件都被检查,因此,在这种情况下,key.readyOps() 将返回一个数字,其位表示可用于处理的操作。 SelectionKey.OP_READ 是另一个整数。所以我了解这两者之间的关系。
所以我脑海中的第一个测试(key.readyOps() & SelectionKey.OP_READ) 将返回true 或false。如果key.readyOps() == SelectionKey.OP_READ 是正确的,那么是真的吗?还是key.readyOps() 包含为OP_READ 设置的正确位。该特定 if 语句的开头包含相同的测试,但使用 OP_ACCEPT 而不是 OP_READ。你可以在第 33 页看到。
那么序列中的下一个测试== SelectionKey.OP_READ这里发生了什么?
在我的脑海中,我看到这样的评估:
if(true == SelectionKey.OP_READ)
或
if(false == SelectionKey.OP_READ)
但这不可能吧?因为 OP_READ 是一个整数?或者对于除 0 以外的任何东西,int 是否都为真?我认为这也不对,因为第二部分是多余的。
以上工作正常,我只是不清楚if 测试的实际情况。
接下来,我想知道一旦上述计算结果为true 时如何处理阅读。
首先我打电话给SocketChannel sc = (SocketChannel) key.channel(); 来获取频道的句柄。
然后我准备好缓冲区并使用int bytesRead = sc.read(myBuffer);从套接字读取
现在我需要测试读取的内容,对吗?所以我做了这样的事情:
if(read == -1){
// The connection has been terminated, handle that.
}else if(read == 0){
// Check data is complete, if so switch to OP_WRITE
}else{
// Read bytes into the buffer
}
那么以上是可以接受的吗?
javadoc 对OP_READ 进行了以下说明:
读操作的操作设置位。假设一个选择键的 兴趣集在选择操作开始时包含 OP_READ。 如果选择器检测到相应的通道已准备好 阅读,已达到流尾,已远程关闭 进一步阅读,或者有一个错误挂起,那么它将添加 OP_READ 到 键的就绪操作集,并将键添加到其选定键集。
【问题讨论】:
标签: java bit-manipulation nio