package player.kent.chen.temp.learnnio.selector; 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; public class PlaySelector { public static void main(String[] args) throws IOException, InterruptedException { ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.socket().bind(new InetSocketAddress(17547)); serverChannel.configureBlocking(false); Selector selector = Selector.open();//这个selector将同时用于serverChannel和accept()后针对单个连接的socketChannel serverChannel.register(selector, SelectionKey.OP_ACCEPT); //侦听ACCEPT就绪事件 System.out.println("开始侦听连接..."); while (true) { int n = selector.select(); //阻塞直到有事件发生 if (n == 0) { //这代表selector被别的线程惊醒,不代表任何就绪事件 continue; } Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key = it.next(); if (key.isAcceptable()) { System.out.println("serverChannel上有新连接了"); SocketChannel socketChannel = ((ServerSocketChannel) key.channel()).accept(); //为针对单个连接的socketChannel注册“读就绪”key if (socketChannel != null) { //真有可能为null socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); //还用那个selector socketChannel.write(ByteBuffer.wrap(("Hi, man\n").getBytes())); //问候客户端 } } if (key.isReadable()) { System.out.println("针对某个连接的socketChannel可读了"); SocketChannel socketChannel = (SocketChannel) key.channel(); if (socketChannel != null) { //读取输入后关闭socket ByteBuffer inputBuffer = ByteBuffer.allocate(10); socketChannel.read(inputBuffer); inputBuffer.flip(); String strRead = new String(inputBuffer.array()); System.out.println("The user has input: " + strRead); socketChannel.close(); } } it.remove(); } } } }