作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在学习 NIO 包。我引用了 here 中的 NioServer 示例. NioServer.java
中的选择器线程在
this.selector.select();
Iterator<SelectionKey> selectedKeys = this.selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = selectedKeys.next();
selectedKeys.remove();
if (!key.isValid()) {
continue;
}
if (key.isAcceptable()) {
this.accept(key);
} else if (key.isReadable()) {
this.read(key);
} else if (key.isWritable()) {
this.write(key);
}
当远程客户端连接时,this.accept(key)
被调用并且在这个方法中感兴趣interestOps 更改为 Read 并唤醒选择器。这是导致选择器选择该 channel 的原因吗?所以我们以这种方式发出信号以选择 channel ?
现在假设写入一个套接字 channel 选择器是通过改变感兴趣的是 channel 已准备好写入。但是假设由于套接字缓冲区已满而导致写入未完成,如代码所示,那么我们不会改变兴趣并将其保持为只写状态。那么选择器什么时候会选择这个 channel 呢?
最佳答案
this.accept(key)
调用 serverSocketChannel.accept()
返回一个新套接字 channel 用于与客户端通信.为“读取”操作向选择器注册的是这个 channel ,即选择器现在有两个注册:
如果由于缓冲区已满而无法完成写入,则相应的 SocketChannel 将保持向 OP_WRITE 注册。一旦客户端从另一端读取一些数据, channel 将再次被选择,允许我们在将兴趣集翻转回 OP_READ 之前写入剩余的数据。
关于java - java nio 选择器什么时候在 select() 调用上解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005183/
我是一名优秀的程序员,十分优秀!