AIO 初体验
服務端代碼:
package com.gupaoedu.vip.netty.io.aio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * AIO 服務端 */ public class AIOServer {private final int port;public static void main(String args[]) {int port = 8000;new AIOServer(port);}public AIOServer(int port) {this.port = port;listen();}private void listen() {try {ExecutorService executorService = Executors.newCachedThreadPool();AsynchronousChannelGroup threadGroup = AsynchronousChannelGroup.withCachedThreadPool(executorService, 1);final AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(threadGroup);server.bind(new InetSocketAddress(port));System.out.println("服務已啟動,監聽端口" + port);server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>(){final ByteBuffer buffer = ByteBuffer.allocateDirect(1024);public void completed(AsynchronousSocketChannel result, Object attachment){System.out.println("IO 操作成功,開始獲取數據");try {buffer.clear();result.read(buffer).get();buffer.flip();result.write(buffer);buffer.flip();} catch (Exception e) {System.out.println(e.toString());} finally {try {result.close();server.accept(null, this);} catch (Exception e) {System.out.println(e.toString());}}System.out.println("操作完成");}@Overridepublic void failed(Throwable exc, Object attachment) {System.out.println("IO 操作是失敗: " + exc);}});try {Thread.sleep(Integer.MAX_VALUE);} catch (InterruptedException ex) {System.out.println(ex);}} catch (IOException e) {System.out.println(e);}} }客戶端代碼:
package com.leon.vip.netty.io.aio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; /** * AIO 客戶端 */ public class AIOClient {private final AsynchronousSocketChannel client;public AIOClient() throws Exception{client = AsynchronousSocketChannel.open();}public void connect(String host,int port)throws Exception{client.connect(new InetSocketAddress(host,port),null,new CompletionHandler<Void,Void>() {@Overridepublic void completed(Void result, Void attachment) {try {client.write(ByteBuffer.wrap("這是一條測試數據".getBytes())).get();System.out.println("已發送至服務器");} catch (Exception ex) {ex.printStackTrace();}}@Overridepublic void failed(Throwable exc, Void attachment) {exc.printStackTrace();}});final ByteBuffer bb = ByteBuffer.allocate(1024);client.read(bb, null, new CompletionHandler<Integer,Object>(){@Overridepublic void completed(Integer result, Object attachment) {System.out.println("IO 操作完成" + result);System.out.println("獲取反饋結果" + new String(bb.array()));}@Overridepublic void failed(Throwable exc, Object attachment) {exc.printStackTrace();}});try {Thread.sleep(Integer.MAX_VALUE);} catch (InterruptedException ex) {System.out.println(ex);}}public static void main(String args[])throws Exception{new AIOClient().connect("localhost",8000);} }?
?
?
總結
- 上一篇: AIO(Asynchronous IO)
- 下一篇: Netty 采用NIO 而非AIO 的理