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