nio2 程式碼理解--netty in action
阿新 • • 發佈:2020-08-08
public class PlainNio2EchoServer{ public void serve(int port)throws IOExcetpion{ System.out.println("listening for connection on port "+port); final AsychronousServerSocketChannel serverChannel = AsychronousServerSocketChannel.open(); InetAddress address = new InetAddress(port); serverChannel.bind(address); final CountDownLatch latch = new CountDownLatch(1); serverChannel.accept(null, new CompletionHandler<AsychronousSocketChannel,Object>(){ @Override public void completed(AsychronousSocketChannel channel,Object attachment){ serverChannel.accept(null,this); ByteBuffer buffer = ByteBuffer.allocate(100); channel.read(buffer,buffer,new EchoCompletionHandler(channel)); } @Override public void failed(Throwable throwable,Object attachment){ try{ serverChannel.close(); }catch(IOExcetpion ex){ }finally{ latch.countDown(); } } }); try{ latch.await(); }catch(InterruptedException ex){ Thread.currentThread().interrupt(); } } private final class EchoCompletionHandler implements CompletionHandler<Integer,ByteBuffer>{ private AsychronousSocketChannel channel; public EchoCompletionHandler(AsychronousSocketChannel channel){ this.channel = channel; } @Override public void completed(Integer result,ByteBuffer buffer){ buffer,flip(); channel.write(buffer,buffer, new CompletionHandler<Integer,ByteBuffer>{ @Override public void completed(Integer result,ByteBuffer buffer){ if(buffer.hasRemaining()){ channel.write(buffer,buffer,this); }else{ buffer.compact(); channel.read(buffer,buffer,EchoCompletionHandler.this); } } @Override public void failed(Throwable throwable,ByteBuffer attachment){ try{ channel.close(); }catch(IOExcetpion ex){ } } }); } @Override public void failed(Throwable throwable,ByteBuffer attachment){ try{ channel.close(); }catch(IOExcetpion ex){ } } } }
該程式碼段 出自於第五版書中英文版第一章。
第一,程式碼實際表述的跟我們理解的非同步IO是一樣的,表述不一樣而已。
該段程式碼的解讀工作其實最主要的是2個方法的理解。
1, serverChannel.accept(null,new CompletionHanlder<AsynchronousSocketChannel>{...})
2, channel.read/write(buffer,buffer, new CompletionHandler<Integer,ByteBuffer>{...})
非同步IO的特點是訊號驅動,比如severChannle accepte 新的connection ,那麼執行的回撥函式就是類CompletionHandler 中的completed()函式。accepte(..)函式是系統呼叫