該節主要講解 Netty 的構成部分。
一、Channel
它代表一個用於連接到實體如硬件設備、文件、網絡套接字或程序組件,能夠執行一個或多個不同的 I/O 操作的開放連接。可以比作傳入和傳出數據的傳輸工具。
二、Callback(回調)
它就是一個方法,提供給另一種方法作為引用,這樣后者就可以在某個合適的時間調用前者。比如下面的代碼:
1 public class DiscardServerHandler extends ChannelInboundHandlerAdapter { 2 3 /** 4 * 收到數據時調用 5 */ 6 @Override 7 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 8 // TODO 數據處理 9 } 10 }
當服務器收到消息時,會自動調用 ChannelRead 方法,因此我們可以重寫該方法來實現對收到數據的處理。
三、Future
它提供了另外一種通知應用操作已經完成的方式。每個 Netty 的出站(outbound) I/O 操作都會返回一個 ChannelFuture ,它允許一個或者多個 ChannelFutureListener 實例,回調方法 operationComplete() 會在操作完成時調用,下面為示例代碼:
1 // 啟動客戶端,客戶端用connect連接 2 ChannelFuture f = b.connect(host, port).sync(); 3 f.addListener(new ChannelFutureListener() { 4 public void operationComplete(ChannelFuture future) throws Exception { 5 if(future.isSuccess()) { // 連接成功 6 ByteBuf buf = Unpooled.copiedBuffer("hello", // 寫數據 7 Charset.defaultCharset()); 8 ChannelFuture wf = future.channel().writeAndFlush(buf); // 發送數據 9 } else { 10 // 打印錯誤 11 Throwable cause = future.cause(); 12 cause.printStackTrace(); 13 } 14 } 15 });
上面的代碼首先連接到遠程地址,當連接完成時,檢查連接狀態,若成功發送 hello,否則拋出錯誤。
四、Event 和 Handler
沒看懂,以后補。