先简单介绍nio中的几个概念: 1.buffer:内存块,实质就是一个数组,nio数据读或写到中转地 2.channel: 通道,用于向buffer提供数据或读取数据,异步I/O支持 3.selector: channel时间的监听者,他能检测到一个或多个通道,并将时间分发出去 4.selectorKey:在channel上发生的事件,包含了事件的状态信息和时间以及对应的channel Channel的状态有四种: ①、Connectable:当一个Channel完成socket连接操作已完成或者已失败。 ②、Acceptable:当一个Channel已准备好接受一个新的socket连接时,channel是Acceptale ③、Readable:当一个channel能被读时。 ④、Writable:当一个Channel能被写时为可写状态。
Reactor模式的几个概念
1.reactor(反应器): 负责响应io事件,当检测到一个新的事件,将其发送给相应的handler处理; 2.handlers(句柄):负责处理非阻塞的行为,标识系统管理的资源,同时handler与事件绑定; 3.Event Handler(事件处理器):以特定的方式来处理相应的事件
①、Reactor类,实现NIO的创建以及事件的监听。(关键代码)
selector = Selector.open();
ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.socket().bind(new InetSocketAddress(8080));
selectionKey = ssc.register(selector, SelectionKey.OP_ACCEPT);
selector = Selector.open(); SelectionKey sk = serverSocket.register(…); //这里利用sk的attach绑定Acceptor,如果有事件,则触 //发Acceptor,相当于swing中的addListener(Listener) sk.attach(new Acceptor()); ②、任务分派处理,相应运行任务。 Void dispatch(selectionKey key){ Runnable r = (Runnable)it.next(); if(r!=null) r.run(); } ③、Reactor里内置Acceptor类,实现分派任务操作处理。 try{ SocketChannel c = serverSocket.accept(); if (c != null) //调用Handler来处理channel new SocketReadHandler(selector, c); } } ④、Handler类,负责处理请求。 Handler(Selector sel, SocketChannel c) throws IOException { socket = c; socket.configureBlocking(false); sk = socket.register(sel, 0); //将SelectionKey绑定为本Handler 下一步有事件触发时,将调用本类的run方法 sk.attach(this); //同时将SelectionKey标记为可读,以便读取。 sk.interestOps(SelectionKey.OP_READ); sel.wakeup(); }