`
liziyun537
  • 浏览: 854 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

nio~Selector

 
阅读更多
*对于nio的非阻塞I/O操作,使用Selector获取哪些I/O准备就绪,注册的SelectionKey集合记录关联的Channel这些信息.SelectionKey记录Channel对buffer的操作方式.
---SelectableChannel,Selector,SelectionKey是nio中Channel操作的3个主要部件.
---对应关系,
一个SelectableChannel,记录了一组注册的SelectionKey[]
一个SelectionKey,关联了一个Channel和一个Selector.
一个Selector,维护着注册的一组SelectionKey
*使用示例
---注,这段代码来自"TCP/IP Sockets in Java",典型示例,我做了注解
package chapter5;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.Iterator;

public class TCPServerSelector {
private static final int BUFSIZE = 256;  //Buffer,EchoSelectorProtocol
private static final int TIMEOUT = 3000; //Selector.select(long timeout)

public static void main(String[] args) throws IOException {
if(args.length<1){
throw new IllegalArgumentException("Parameter(s): <Port> ...");
}

Selector selector =Selector.open(); //创建Selector实例
for(String arg:args){
ServerSocketChannel listnChannel =ServerSocketChannel.open();
listnChannel.socket().bind(new InetSocketAddress(Integer.parseInt(arg)));
listnChannel.configureBlocking(false); //nonblocking
listnChannel.register(selector, SelectionKey.OP_ACCEPT); //Channel注册selector,并告知channel感兴趣的操作
}

TCPProtocol protocol =new EchoSelectorProtocol(BUFSIZE);
while(true){ //循环
if(selector.select(TIMEOUT)==0){ //返回准备就绪I/O的SelectionKey数
System.out.println("."); //to do others
continue;
}

Iterator<SelectionKey> keyIter =selector.selectedKeys().iterator();//获取已选的SelectionKey集合
while(keyIter.hasNext()){ //遍历key,根据key的类型做相应处理
SelectionKey key =keyIter.next();
if(key.isAcceptable())
protocol.handleAccept(key);

if(key.isReadable())
protocol.handleRead(key);

//SelectionKey is invalid if it is cancelled, its channel is closed, or its selector is closed.
if(key.isValid() && key.isWritable())
protocol.handleWrite(key);

keyIter.remove(); //手动清空,因为Selector只会在已选的SelectionKey集中添加
}
}

}
}

package chapter5;

import java.io.IOException;
import java.nio.channels.SelectionKey;

public interface TCPProtocol {
void handleAccept(SelectionKey key) throws IOException;
void handleRead(SelectionKey key) throws IOException;
void handleWrite(SelectionKey key) throws IOException;
}

package chapter5;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class EchoSelectorProtocol implements TCPProtocol {

private int bufSize;

public EchoSelectorProtocol(int bufSize){
this.bufSize =bufSize;
}

@Override
public void handleAccept(SelectionKey key) throws IOException {
SocketChannel clntChan = ((ServerSocketChannel)key.channel()).accept();
clntChan.configureBlocking(false);
//对于已注册Selector的Channel,再次调用就更新注册信息,这里更新了SelectionKey的类型和附件,附件是需要操作的buffer.
clntChan.register(key.selector(), SelectionKey.OP_READ,ByteBuffer.allocate(bufSize));
}

@Override
public void handleRead(SelectionKey key) throws IOException {
SocketChannel clntChan =(SocketChannel)key.channel();
ByteBuffer buf =(ByteBuffer) key.attachment(); //获取附件
long bytesRead = clntChan.read(buf);
if(bytesRead==-1) //channel已读到结束位置
clntChan.close();
else if(bytesRead > 0)
key.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}

@Override
public void handleWrite(SelectionKey key) throws IOException {
ByteBuffer buf =(ByteBuffer) key.attachment();
buf.flip();
SocketChannel clntChan =(SocketChannel) key.channel();
clntChan.write(buf);
if(!buf.hasRemaining()){
key.interestOps(SelectionKey.OP_READ); //设置Key的兴趣集
}
buf.compact();
}

}
看了代码,如何使用就清楚了吧:).
下面再做些细节说明
*Selector
---更新准备好的SelectionKey,移除isValid()为false的SelectionKey
select() //阻塞等待,直至一个channel准备好或调用wakeup()才返回
select(long timeout) //如上,返回条件多了个超时时间
selectNow() //非阻塞,会立刻返回,没有时返回值=0
wakeup() //使得Selector返回
注意,select()会在上次已选择的键集中添加这次的可用键,故在2次select之间,手动移除已处理的SelectionKey.
*SelectionKey
---兴趣操作集,通过它就可以知道channel可以去做哪些事了.有4种类型,如下:
public static final int OP_READ = 1 << 0;
public static final int OP_ACCEPT = 1 << 4;
public static final int OP_WRITE = 1 << 2;
public static final int OP_CONNECT = 1 << 3;
通过SelectionKey.interestOps(int ops)就可以配置这些值
---附件,主要作用是为channel处理提供辅助信息,如上面示例中att为ByteBuffer
SelectionKey.attach(Object ob) //添加附件,另一种方式SelectableChannel.register(Selector sel, int ops, Object att)
SelectionKey.attachment()  //获取附件
---SelectionKey.cancel(),永久的注销键,加入Selector的注销集中,在下次select()时被移除
分享到:
评论

相关推荐

    Java_NIO-Selector.rar_java nio_selector

    Selector是Java NIO框架中的核心组件,它使得单个线程能够管理多个通道(Channels),从而提高系统资源利用率并优化性能。下面我们将详细探讨Java NIO中的Selector机制。 1. **Selector的作用** Selector的主要功能...

    Java_NIO类库Selector机制解析.doc

    Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc

    Java NIO——Selector机制解析三(源码分析)

    本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...

    java nio Selector的使用-客户端

    Selector是Java NIO中的核心组件之一,它允许单个线程处理多个通道(channels)的读写事件,极大地提高了服务器的并发能力。本篇文章将深入探讨如何在Java NIO中使用Selector处理客户端的I/O请求。 首先,我们需要...

    JavaNIO库Selector机制解析.docx

    JavaNIO库Selector机制解析.docx

    Java-NIO类库Selector机制解析.docx

    "Java NIO Selector 机制解析" Java NIO(New I/O)类库是Java 1.4版本以后引入的新一代I/O机制,相比传统的I/O机制,NIO提供了高效、异步、多路复用的I/O操作模式。Selector机制是NIO类库中的一种核心机制,用于...

    Java Nio selector例程

    我研究并实现的Java Nio selector例子。java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server...

    【IT十八掌徐培成】Java基础第27天-03.NIO-Selector.zip

    本教程由知名IT教育专家徐培成讲解,主要聚焦于NIO中的Selector组件,它是NIO系统中的核心部分,用于管理多个通道(Channels)并监听它们的事件。 Selector允许单线程处理多个通道,极大地提高了程序的并发性能。在...

    【IT十八掌徐培成】Java基础第27天-04.NIO-Selector-Server-Client.zip

    课程中的视频文件"Java基础第27天-04.NIO-Selector-Server-Client.avi"很可能包含了实际的代码演示和讲解,帮助学习者直观理解Selector的工作原理以及如何在Java中实现NIO服务器和客户端的交互。通过观看视频和动手...

    Java-NIO之Selector.doc

    Java NIO(非阻塞I/O)中的Selector是一个核心组件,它允许单个线程处理多个通道(channels)上的I/O事件。Selector的角色就像一个交通指挥员,能够监控多个通道并决定哪个通道准备好进行读写操作,从而提高系统的...

    ScalableIOJava(NIO如何实现Selector模式的).pdf

    标题《Scalable IO in Java》和描述表明本文档讨论了Java中的可伸缩网络I/O编程,并且特别聚焦于NIO的Selector模式。NIO,全称为Non-blocking I/O(非阻塞I/O),是Java提供的一种用于处理网络通信或文件I/O的编程...

    NIO详细介绍channle,buffer,Selector

    ### NIO:Channel、Buffer与Selector详解 #### 一、NIO概述 NIO(Non-blocking I/O,非阻塞I/O)是Java为了解决传统阻塞式I/O效率低下的问题而引入的一种新的I/O操作模式。NIO通过引入Channel、Buffer以及Selector...

    java基于NIO选择器Selector的多人聊天室

    Java NIO(非阻塞I/O)是一种在Java中处理I/O操作的高效方式,它引入了选择器(Selector)的概念,使得一个单独的线程可以监控多个输入输出通道(Channels),大大提高了并发处理能力。在这个"java基于NIO选择器...

    Java NIO Selector选择器简介.pdf

    ### Java NIO Selector选择器详解 #### 一、Selector概览及作用 **Selector** 是 Java NIO (New I/O) 框架中的一个重要组成部分,主要用于检测一个或多个 **NIO Channel** 的状态,包括但不限于可读、可写、可连接...

    java nio Selector的使用-服务器端

    Selector是Java NIO中的核心组件,用于监听多个通道的事件,如连接建立、数据可读、写空等。在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的...

    深入了解java NIO之Selector(选择器)

    "深入了解 Java NIO 之 Selector(选择器)" Java NIO(Non-Blocking I/O)中,Selector(选择器)是一种重要的组件,它提供了选择执行已经就绪的任务的能力,使得多元 I/O 成为可能。在 Java 中,Selector 是一种...

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-...23-Java NIO-Selector-示例代码(客户端).mp4 24

    Java NIO Selector用法详解【含多人聊天室实例】

    Selector是Java NIO中的关键组件,用于实现多路复用,即单个线程可以监控多个通道(Channel)的事件,例如读取、写入或连接等。 1. Java NIO Channel与Buffer Channel代表I/O操作的源或目标,如文件、套接字等。...

    JavaNIO chm帮助文档

    Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java ...

Global site tag (gtag.js) - Google Analytics