1、缓冲区(Buffer)
包含一些要写入或者要读出的数据。
NIO中数据都是用缓冲做处理的,在读取数据时,他是直接读到缓存区的;在写入数据时,写入到缓冲区中。
缓冲区实质上就是一个数组,缓冲区提供了对数据的结构化访问以及维护读写位置等信息。(最常用的缓冲区是ByteBuffer)
2、通道Channel
Channel是一个通道,网络数据通过Channel读取和写入。
通道与流的不同之处在于通道是双向的,流只是在一个方向上移动,而通道可以用于读、写或者二者同时进行。
3、多路复用器Selector
多路复用器提供选择一斤就绪的任务的能力。
Selector会不断的轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。(P48)
public class NioTimeServer {
public static void main(String[] args) {
int port = 8080;
if (args != null && args.length > 0){
try {
port = Integer.valueOf(args[0]);
}catch (NumberFormatException e){
}
}
MultplexerTimeServer timeServer = new MultplexerTimeServer(port);
new Thread(timeServer,"NIO-MTS-001").start();
}
}
package buffered.NIO.NIOSection2;
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;
import java.util.Set;
public class MultplexerTimeServer implements Runnable{
private Selector selector;
private ServerSocketChannel serverSocketChannel;
private volatile boolean stop;
/*构造方法,资源初始化
* 创建多路复用器Selector,ServerSockerChannel
* 将ServerSocketChannel注册到Seletor,监听SelectorKey.OP_ACCOPT操作为
* 如果资源初始化失败,则退出
* */
public MultplexerTimeServer(int port){
try {
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();