本文是我學(xué)習(xí)《Netty實(shí)戰(zhàn)》的一些筆記琼牧。
Netty 的核心組件:
- Channel
- 回調(diào)
- Future
- 事件和ChannelHandler
一须鼎、 Channel
Channel 是 java NIO的一個(gè)基本構(gòu)造±焦担可以把Channel看做是傳入或者傳出數(shù)據(jù)的載體灾票。它可以被打開或者關(guān)閉,連接或者斷開連接茫虽。
二刊苍、回調(diào)
一個(gè)回調(diào)就是一個(gè)方法既们,一個(gè)指向已經(jīng)被提供給另外一個(gè)方法的方法的引用,使得后者可以再適當(dāng)?shù)臅r(shí)候調(diào)用前者正什。Netty內(nèi)部使用了回調(diào)來處理事件啥纸,當(dāng)一個(gè)回調(diào)被觸發(fā)時(shí)候,相關(guān)的事件可以被一個(gè)interfaceChannelHandler的實(shí)現(xiàn)處理婴氮。
比如斯棒,當(dāng)一個(gè)新的連接被建立,ChannelHandler的channelActive()回調(diào)方法將會被調(diào)用主经。
public class EchoServerHandler extends ChannelHandlerAdapter{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.write("連接建立!");
}
}
三荣暮、Future
Future提供了另一種在操作完成時(shí)通知應(yīng)用程序的方式。Netty提供了ChannelFuture罩驻,用于在執(zhí)行異步操作的時(shí)候使用穗酥。ChannelFuture提供了方法可以注冊一個(gè)或多個(gè)ChannelFutureListener實(shí)例。listener的回調(diào)方法operationComplete()將會在對應(yīng)的操作完成時(shí)被調(diào)用惠遏。
四砾跃、事件和ChannelHandler
Netty 使用不同的事件來通知我們狀態(tài)的改變或者是操作的狀態(tài)。我們可以基于已經(jīng)發(fā)生的事件來觸發(fā)適當(dāng)?shù)膭?dòng)作爽哎。Netty的事件按照它們與入站或出站數(shù)據(jù)流的相關(guān)性進(jìn)行分類蜓席。
入站:
- 連接已被激活或者連接失活
- 數(shù)據(jù)讀取
- 用戶事件
- 錯(cuò)誤事件
出站:
- 打開或者關(guān)閉到遠(yuǎn)程節(jié)點(diǎn)的連接
- 將數(shù)據(jù)寫到或者沖刷到socket
每個(gè)事件都可被分發(fā)給ChannelHandler類中的某個(gè)用戶實(shí)現(xiàn)的方法。
五课锌、EventLoop
Netty通過觸發(fā)事件講Selector從應(yīng)用程序中抽象出來厨内。在內(nèi)部,為每個(gè)Channel分配一個(gè)EventLoop渺贤,用以處理所有事件雏胃,包括:
- 注冊感興趣的事件
- ==將事件派發(fā)給ChannelHandler==
- 安排進(jìn)一步的動(dòng)作
EventLoop 本身由一個(gè)線程驅(qū)動(dòng),處理了一個(gè)Channel的所有I/O事件志鞍,并且在該EventLoop的整個(gè)生命周期內(nèi)都不會改變瞭亮。