本文是我學習《Netty實戰(zhàn)》的一些筆記。
Netty 的核心組件:
- Channel
- 回調
- Future
- 事件和ChannelHandler
一、 Channel
Channel 是 java NIO的一個基本構造。可以把Channel看做是傳入或者傳出數(shù)據的載體。它可以被打開或者關閉,連接或者斷開連接。
二、回調
一個回調就是一個方法,一個指向已經被提供給另外一個方法的方法的引用,使得后者可以再適當?shù)臅r候調用前者。Netty內部使用了回調來處理事件,當一個回調被觸發(fā)時候,相關的事件可以被一個interfaceChannelHandler的實現(xiàn)處理。
比如,當一個新的連接被建立,ChannelHandler的channelActive()回調方法將會被調用。
public class EchoServerHandler extends ChannelHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.write("連接建立!");
}
}
三、Future
Future提供了另一種在操作完成時通知應用程序的方式。Netty提供了ChannelFuture,用于在執(zhí)行異步操作的時候使用。ChannelFuture提供了方法可以注冊一個或多個ChannelFutureListener實例。listener的回調方法operationComplete()將會在對應的操作完成時被調用。
四、事件和ChannelHandler
Netty 使用不同的事件來通知我們狀態(tài)的改變或者是操作的狀態(tài)。我們可以基于已經發(fā)生的事件來觸發(fā)適當?shù)膭幼鳌etty的事件按照它們與入站或出站數(shù)據流的相關性進行分類。
入站:
- 連接已被激活或者連接失活
- 數(shù)據讀取
- 用戶事件
- 錯誤事件
出站:
- 打開或者關閉到遠程節(jié)點的連接
- 將數(shù)據寫到或者沖刷到socket
每個事件都可被分發(fā)給ChannelHandler類中的某個用戶實現(xiàn)的方法。
五、EventLoop
Netty通過觸發(fā)事件講Selector從應用程序中抽象出來。在內部,為每個Channel分配一個EventLoop,用以處理所有事件,包括:
- 注冊感興趣的事件
- ==將事件派發(fā)給ChannelHandler==
- 安排進一步的動作
EventLoop 本身由一個線程驅動,處理了一個Channel的所有I/O事件,并且在該EventLoop的整個生命周期內都不會改變。