1. 程式人生 > 實用技巧 >nio2 程式碼理解--netty in action

nio2 程式碼理解--netty in action

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(..)函式是系統呼叫