Java NIO小结 (二)
?
除了第一篇小结中讲的Java New/IO的几个基本新特性外,New I/O中一个最突出的特性就是Non-blocking I/O了,这个特性是针对原java.net包中socket编程的一个极大的补充和拓展。究竟non-blocking如何使用?有何特点?与socket的blocking IO相比,有哪些优势?
?
ServerSocket server = new ServerSocket(1299);while (true) { Socket socket = server.accept(); (new RequestHandlerThread(socket)).start();}?
// 打开selctor和服务器端SocketChannel,并且配置为non-blocking模式,然后绑定到9000端口。 Selector sel = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(new InetSocketAddress(9000));// 注册OP_ACCEPT事件,让selector在下一次select操作中选择OP_ACCEPT事件 ssc.register(sel, SelectionKey.OP_ACCEPT);while (selector.select()>0){ Iterator<SelectionKey> keys = selector.selectedKeys().iterator();while (keys.hasNext()) {SelectionKey key = keys.next();keys.remove();if (key.isValid()) {if (key.isAcceptable()) { // .... 接受SocketChannel,并注册OP_READ事件} else if (key.isReadable()) {// ... 从SocketChannel读取数据}else if (key.isWritable()){ // ... 向SocketChannel 写入数据} // 把当前已处理的key放入到selector的cancelling selectionkey集合当中,在下一次select操作中,该key被移去。 key.cancel();}}}?
ByteBuffer buff = ByteBuffer.allocate(128);socketChannel.read(buff);?
byte out[] = new byte[256];for (int i=0; i<256; i++) ? ? ?out[i]=i;socketChannel.write(ByteBuffer.wrap(out));?
?
非阻塞模式/阻塞模式
?