Java Selector 有哪些API操作,给出例子,写上注释,并写在一个main方法里
时间: 2023-06-10 18:06:41 浏览: 98
Java Selector 是一个可以进行异步 I/O 操作的工具类,它可以让一个单独的线程处理多个通道的 I/O 操作。以下是一些 Java Selector 的常用 API 操作,以及相应的注释和示例代码:
```java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class SelectorExample {
public static void main(String[] args) throws IOException {
// 创建一个 Selector
Selector selector = Selector.open();
// 创建一个 ServerSocketChannel 并绑定到指定的端口
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress("localhost", 8080));
// 设置为非阻塞模式
serverSocket.configureBlocking(false);
// 注册 ServerSocketChannel 到 Selector 上,并指定 SelectionKey.OP_ACCEPT 事件
serverSocket.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// 阻塞等待就绪的 Channel,这里会一直等待直到有 Channel 就绪
selector.select();
// 获取已经就绪的 SelectionKey 的集合
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = keys.next();
keys.remove();
// 如果是 OP_ACCEPT 事件,则进行处理
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
// 如果是 OP_READ 事件,则进行处理
} else if (key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
buffer.flip();
String data = new String(buffer.array(), 0, buffer.limit());
System.out.println("Received message: " + data);
}
}
}
}
}
```
上面的代码中,我们首先创建了一个 Selector,然后创建了一个 ServerSocketChannel,并将其注册到 Selector 上,并指定 SelectionKey.OP_ACCEPT 事件。在 while 循环中,我们使用 Selector 的 select() 方法来阻塞等待就绪的 Channel,然后通过 selectedKeys() 方法获取已经就绪的 SelectionKey 的集合。遍历集合中的 SelectionKey,根据不同的事件类型进行处理,如果是 OP_ACCEPT 事件,则说明有新的客户端连接,我们需要将其注册到 Selector 上,并指定 SelectionKey.OP_READ 事件;如果是 OP_READ 事件,则说明有客户端发送了数据,我们需要读取数据并进行处理。
阅读全文