SelectionKey源码解析
转载自:
http://blog.csdn.net/robinjwong/article/details/41792623
SelectionKey表示监听的事件。将channel注册到selector上时,需要声明SelectionKey,以此声明监听事件。(这样Selector才知道需要记录什么数据)
注:
句柄:可以认为是对象身份的唯一id,标识应用程序中的不同对象和同类中的不同的实例。句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。
解析jdk源码:
//表示SelectableChannel 在Selector中的注册的标记/句柄
public abstract class SelectionKey {
//构造该类的一个实例。
protected SelectionKey() { }
//返回创建此键的通道。即使在键被取消后,该方法将仍然返回通道。
public abstract SelectableChannel channel();
//返回创建此键的选择器。该方法将在取消键后,继续返回选择器。
public abstract Selector selector();
//说明此键是否有效。key在创建时是有效的,直到它被取消,其通道关闭,或其选择器关闭。
public abstract boolean isValid();
/**
*请求用选择器注册这个密钥的通道。
*被取消。在返回时,key将无效并将一直存在。
*添加到选择器的取消键集中。
*在下一次选择操作中所有选择器的键集将被移除。
*如果这个键已经被取消了,那么调用这个方法就没有影响。一旦取消,key将永远无效。
*这个方法可以在任何时候调用。它同步选择器的取消键集,因此在调用时可能会阻塞。
*与取消或选择有关的操作同时进行。
*/
public abstract void cancel();
/**检索此键的兴趣集。(既SelectionKey选择的4个监听key)
*保证返回的集合只包含对该密钥通道操作有效的位。这个方法可以在任何时候调用。
*不管它是否阻塞,以及实现依赖的时间长短。
*/
public abstract int interestOps();
/**
*将此键的兴趣设置为给定值。这个方法可以在任何时候调用。
*不管它是否阻塞,以及实现依赖的时间长短。
*/
public abstract SelectionKey interestOps(int ops);
//检索此键的已操作集。
public abstract int readyOps();
/**
*操作设置位用于读取操作。 1不进行左移
*假设一个选择键的兴趣集包含OP_READ。如果选择器
*检测到对应的通道已准备好读取,已经到达。
*结束流,已被远程关闭以供进一步阅读或使用。
*在未处理的情况下,它将添加OP_READ到关键字。
*已经操作的集合,并将键添加到它的选择键。
*/
public static final int OP_READ = 1 << 0;
//写操作 1左移2位--4
public static final int OP_WRITE = 1 << 2;
//客户端请求连接服务端 1左移3位--8
public static final int OP_CONNECT = 1 << 3;
//服务端请求连接客户端 1左移4位--16
public static final int OP_ACCEPT = 1 << 4;
/**
*测试此键的通道是否可以读取。
*如不支持读取操作,则返回false。
*/
public final boolean isReadable() {
return (readyOps() & OP_READ) != 0;
}
//测试此键的通道是否可以写入。
public final boolean isWritable() {
return (readyOps() & OP_WRITE) != 0;
}
//测试此键的通道是否可以连接。
public final boolean isConnectable() {
return (readyOps() & OP_CONNECT) != 0;
}
//测试此键的通道是否可以连接。
public final boolean isAcceptable() {
return (readyOps() & OP_ACCEPT) != 0;
}
private volatile Object attachment = null;
private static final AtomicReferenceFieldUpdater<SelectionKey,Object>
attachmentUpdater = AtomicReferenceFieldUpdater.newUpdater(
SelectionKey.class, Object.class, "attachment"
);
//将给定对象连接到此键。
public final Object attach(Object ob) {
return attachmentUpdater.getAndSet(this, ob);
}
//检索当前的附件。
public final Object attachment() {
return attachment;
}
}
分享到:
相关推荐
本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...
同时只要在就绪的SelectionKey列表中有至少一个SelectionKey存在,前述方法均将返回。 SocketChannel被Selector检查,检查其声称可以接受的状态是否已经产生,如当SocketChannel在向Selector注册是设置了可接受...
#### 五、关键概念解析 - **SelectionKey**: `SelectionKey`是`Channel`和`Selector`之间的桥梁,它包含以下信息: - 关联的`Channel`。 - 关联的`Selector`。 - 通道的“兴趣集”,即希望`Selector`监控的事件...
- `java.nio.channels.SelectionKey`:每个已注册的通道都会有一个对应的SelectionKey,它包含了通道与选择器之间的关系以及感兴趣的事件类型。 3. NIO工作流程 - 打开通道:例如创建一个FileChannel或...
用Java实现非阻塞通信 java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非...selected-keys集合中,就表示与这个SelectionKey对象相关的事件发生了。
2. 循环监听Selector,当有新的连接或数据可读时,Selector会返回一个SelectionKey。 3. 处理新连接:创建SocketChannel,将其注册到Selector,监听读事件。 4. 处理数据:读取SocketChannel中的数据到ByteBuffer,...
- `多路复用I/O`:如Java的`Selector`和`SelectionKey`,可以让服务器在一个线程中同时处理多个客户端连接,提高性能。 - `线程池`:使用`ExecutorService`管理线程,避免频繁创建和销毁线程,优化系统资源。 6. ...
### Netty5.0架构剖析和源码解读 #### 1. 概述 ##### 1.1. JAVA的IO演进 ###### 1.1.1. 传统BIO通信的弊端 在JDK 1.4之前,Java网络编程主要依赖于传统的同步阻塞I/O模型(BIO)。这一模型虽然简化了应用程序的...
- **SelectionKey**:当一个 Channel 被注册到 Selector 上时,会返回一个 `SelectionKey` 对象,该对象表示了 Channel 与 Selector 之间的关联。通过 `SelectionKey` 可以获取到 Channel 的状态,从而判断是否可以...
NIO的核心概念包括Channel、Selector、SelectionKey和Buffer。 1. **Channel(通道)**:在NIO中,数据是通过Channel传输的,类似于IO中的InputStream和OutputStream。Channel可以读取和写入数据,并且可以与多种...
SelectionKey acceptKey = serverSocket.register(selector, SelectionKey.OP_ACCEPT); ``` 客户端则使用`Socket`类建立连接到服务器的通道: ```java Socket socket = new Socket("localhost", 8888); ``` 在...
6. **事件驱动编程**:为了实时响应客户端的连接和断开,系统可能会使用Java的I/O多路复用技术,如Selector和SelectionKey,或者采用Java NIO(非阻塞I/O)框架,提高系统的响应速度。 7. **异常处理**:在网络编程...
理解BitTorrent协议的工作原理,包括Tracker服务器的作用、Torrent文件的结构、Piece Hashing和校验机制,对解析源码至关重要。 3. **网络编程**:Azureus涉及到大量的网络通信,包括TCP/IP套接字编程,如Socket和...
选择器会不断轮询所有注册的通道,当有事件发生时,返回一组`SelectionKey`,通过这些键可以获取触发事件的通道并进行相应操作。 NIO的非阻塞特性使得I/O操作不会阻塞应用程序的执行,当没有数据可读或无法写入时,...
Selector可以监控多个Channel(通道),当这些Channel准备好读、写或者有连接到达时,Selector会返回一个包含就绪Channel的`SelectionKey`集合。以下是一个简单的步骤概述: 1. **创建Selector**:首先,我们需要...
3. 将ServerSocketChannel注册到Selector,指定感兴趣的操作,例如接受连接操作OP_ACCEPT,通过ssc.register(selector, SelectionKey.OP_ACCEPT)。 4. 使用Selector.select()方法进行轮询,获取有事件发生的...
- `SelectionKey`:代表了通道与选择器之间的注册关系,包含了通道的可选操作。 - `Selector.select()`:等待并返回已准备好的通道集合。 - `Channels.newChannel()`:从输入/输出流创建通道。 在学习Java NIO时,...
client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); while (true) { selector.select(); for (SelectionKey key : selector.selectedKeys()) { if (key.isConnectable()) { // 连接...