package nio; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; 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 NIOServer { private ByteBuffer recBf = ByteBuffer.allocate(1024); private Selector selector;//接收select private Selector proccessor;//读写 public NIOServer(){ try { ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ServerSocket ss = ssc.socket(); ss.bind(new InetSocketAddress(8888)); selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); System.out.println("start 8888"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class Handler extends Thread{ public Handler(String name,SocketChannel client){ try { if(proccessor == null){ proccessor =Selector.open(); } client.register(proccessor, SelectionKey.OP_READ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.setName(name); } public void run(){ System.out.println("begin run"); try { while(proccessor.select()>0){ Set<SelectionKey> selectedKeys = proccessor.selectedKeys(); Iterator<SelectionKey> it = selectedKeys.iterator(); while(it.hasNext()){ SelectionKey sk = it.next(); it.remove(); handler(sk); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void startAcceptor(){ try { while(selector.select()>0){ Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> it = keys.iterator(); while(it.hasNext()){ SelectionKey sk = it.next(); it.remove(); handler(sk); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void handler(SelectionKey sk){ ServerSocketChannel service; SocketChannel client =null; if(sk.isAcceptable()){ service = (ServerSocketChannel) sk.channel(); try { client = service.accept(); client.configureBlocking(false); new Handler("s",client).start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(sk.isReadable()){ client = (SocketChannel)sk.channel(); recBf.clear(); try { int count = client.read(recBf); if(count>0){ System.out.print(new String(recBf.array(),0,count)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[]a){ NIOServer n = new NIOServer(); n.startAcceptor(); } }
window 下,运行cmd ,telnet localhost 8888 即可测试。