- while (true) {
- //当注册的事件到达时,方法返回;否则,该方法会一直阻塞
- selector.select();
- // 获得selector中选中的项的迭代器,选中的项为注册的事件
- Iterator ite = this.selector.selectedKeys().iterator();
- while (ite.hasNext()) {
- SelectionKey key = (SelectionKey) ite.next();
- // 删除已选的key,以防重复处理 为什么要删除呢?主要是要删除selector中已经操作过的SelectionKey,这样子才可以把selector处于监听状态,否则会因为在selector中依然有SelectionKey,而继续接收解析SelectionKey ,导致在下一次请连接中请求到了无效的通道
- ite.remove();
- // 客户端请求连接事件
- if (key.isAcceptable()) {
- //连接请求一般都会发生在ServerSocketChannel上,而这上面也只能作请求监听。
- ServerSocketChannel server = (ServerSocketChannel) key
- .channel();
- // 获得和客户端连接的通道
- SocketChannel channel = server.accept();
- // 设置成非阻塞
- channel.configureBlocking(false);
- //在这里可以给客户端发送信息哦
- channel.write(ByteBuffer.wrap(new String("向客户端发送了一条信息").getBytes()));
- //在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限。
- channel.register(this.selector, SelectionKey.OP_READ);
- // 获得了可读的事件
- } else if (key.isReadable()) {
- read(key);
- } else if(key.isWritable()){
- //写操作及其特殊.因为注册了写操作就是一直会在本地生成,新的新的写监听。所以如果不手工去注消,则会导致一直在作写操作
- write(key);
- }
- }
- }
NIO流程思考---理解流程
最新推荐文章于 2024-07-12 14:26:59 发布