Java Socket编程(五)NIO
public class TCPSelectorServerTest {public static void main(String[] args) throws Exception {Selector selector = Selector.open();int[] ports = { 1234, 5678 };for (int port : ports) {ServerSocketChannel listenChannel = ServerSocketChannel.open();listenChannel.socket().bind(new InetSocketAddress("localhost", port));listenChannel.configureBlocking(false);listenChannel.register(selector, SelectionKey.OP_ACCEPT);}while (true) {if (selector.select(3000) == 0) {System.out.print(".");continue;}Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();while (keyIter.hasNext()) {SelectionKey key = keyIter.next();if (key.isAcceptable()) {SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();clientChannel.configureBlocking(false);clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(32));}if (key.isReadable()) {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = (ByteBuffer) key.attachment();long bytesRead = clientChannel.read(buffer);if (bytesRead == -1)clientChannel.close();elsekey.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);}if (key.isValid() && key.isWritable()) {ByteBuffer buffer = (ByteBuffer) key.attachment();buffer.flip();SocketChannel clientChannel = (SocketChannel) key.channel();clientChannel.write(buffer);// No left, no longer interest in writeif (!buffer.hasRemaining())key.interestOps(SelectionKey.OP_READ);buffer.compact();}keyIter.remove();}}}}