Netty核心技術(shù)及源碼剖析-Netty核心模塊

Bootsrap、ServerBootstrap

1匿沛、Bootsrap意思是引導(dǎo),一個Netty應(yīng)用通常由一個Bootsrap開始,主要作用是配置整個Netty程序,串聯(lián)各個組件,Netty中Bootstrap類是客戶端程序的啟動引導(dǎo)類,ServerBootstrap是服務(wù)器端啟動引導(dǎo)類。
2榛鼎、常見的方法有

  • public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup),該方法用于服務(wù)器端,用來設(shè)置兩個EventLoop
  • public B group(EventLoopGroup group),該方法用于客戶端,用來設(shè)置一個EventLoopGroup
  • public B channel(Class<? extends C> channelClass),該方法用來設(shè)置一個服務(wù)器端的通道實現(xiàn)
  • public <T> B option(ChannelOption<T> option, T value),用來給ServerChannel添加配置
  • public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value),用來給接收到的通道添加配置
  • public ServerBootstrap childHandler(ChannelHandler childHandler),該方法用來設(shè)置業(yè)務(wù)處理類(自定義的handler)
  • public ChannelFuture bind(int inetPort),該方法用于服務(wù)器端,用來設(shè)置占用的端口號
  • public ChannelFuture connect(String inetHost, int inetPort),該方法用于客戶端,用來連接服務(wù)器

Future逃呼、ChannelFuture

1、Netty中所有的IO操作都是異步的,不能like得知消息是否被正確處理借帘。但是可以過一會等它執(zhí)行完成或者注冊一個監(jiān)聽,具體的實現(xiàn)就是通過Future和ChannelFutures,它們可以注冊一個監(jiān)聽,當(dāng)操作執(zhí)行成功或失敗時監(jiān)聽會自動觸發(fā)注冊的監(jiān)聽事件蜘渣。
2、常見的方法有

  • Channel channel(),返回當(dāng)前正在進行IO操作的通道
  • ChannelFuture sync,等待異步操作執(zhí)行完畢

Channel

1肺然、Netty網(wǎng)絡(luò)通信的組件,能夠用于執(zhí)行網(wǎng)絡(luò)I/O操作
2、通過Channel可獲得當(dāng)前網(wǎng)絡(luò)連接的通道的狀態(tài)
3腿准、通過Channel可獲得網(wǎng)絡(luò)連接的配置參數(shù)(例如接收緩沖區(qū)大小)
4际起、Channel提供異步的網(wǎng)絡(luò)I/O操作(如建立連接,讀寫,綁定端口),異步調(diào)用意味著任何I/O調(diào)用都將立即返回,并且不找正在調(diào)用結(jié)束時鎖請求的I/O操作已完成
5、調(diào)用立即返回一個ChannelFuture實例,通過注冊監(jiān)聽器到ChannelFuture上,可以I/O操作成功吐葱、失敗或取消時回調(diào)通知調(diào)用方
6街望、支持關(guān)聯(lián)I/O操作與對應(yīng)的處理程序
7、不同協(xié)議弟跑、不同的阻塞類型的連接都有不同的Channel類型與之對應(yīng)的,常用的Channel類型

  • NioSocketChannel,異步的客戶端TCP Socket連接灾前。
  • NioServerSocketChannel,異步的服務(wù)器端TCP Socket連接。
  • NioDatagramChannel,異步的UDP連接孟辑。
  • NioSctpChannel,異步的客戶端Sctp連接哎甲。
  • NioSctpServerChannel,異步的Sctp服務(wù)器端連接,這些通道涵蓋了UDP和TCP網(wǎng)絡(luò)IO以及文件IO蔫敲。

Selector

1、Netty基于Selector對象實現(xiàn)I/O多路復(fù)用,通過Selector一個線程可以監(jiān)聽多個連接的Channel事件炭玫。
2奈嘿、當(dāng)向一個Selector中注冊Channel后,Selector內(nèi)部的機制就可以自動不斷地查詢(Select)這些注冊的Channel是否有已就緒的I/O事件(例如可讀,可寫,網(wǎng)絡(luò)連接完成等),這樣程序就可以很簡單地使用一個線程高效地管理多個Channel

ChannelHandler及其實現(xiàn)類

1、ChannelHandler是一個接口,處理I/O事件或攔截I/O操作,并將其轉(zhuǎn)發(fā)到其ChannelPipeline(業(yè)務(wù)處理鏈)中的下一個處理程序吞加。
2裙犹、ChannelHandler本身并沒有提供很多方法,因為這個接口有許多的方法需要實現(xiàn),方便使用期間,可以繼承它的子類。
3衔憨、ChannelHandler及其實現(xiàn)類一覽

ChannelInboundHandler 用于處理入站 I/O 事件叶圃。
ChannelOutboundHandler 用于處理出站 I/O 操作。
//適配器
ChannelInboundHandlerAdapter 用于處理入站 I/O 事件践图。
ChannelOutboundHandlerAdapter 用于處理出站 I/O 操作盗似。
ChannelDuplexHandler 用于處理入站和出站事件。


4平项、我們經(jīng)常需要自定義一個Handler類去繼承ChannelInboundHandlerAdapter,然后通過重寫相應(yīng)方法實現(xiàn)業(yè)務(wù)邏輯

public class ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler {

    public ChannelInboundHandlerAdapter() {
    }
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception 
    {
        ctx.fireChannelRegistered();
    }
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelUnregistered();
    }
    //通道就緒事件
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelActive();
    }
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelInactive();
    }
    //通道讀取數(shù)據(jù)事件
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ctx.fireChannelRead(msg);
    }
    //數(shù)據(jù)讀取完畢事件
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelReadComplete();
    }
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        ctx.fireUserEventTriggered(evt);
    }
    public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelWritabilityChanged();
    }
    //通道發(fā)生異常事件
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.fireExceptionCaught(cause);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赫舒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闽瓢,更是在濱河造成了極大的恐慌接癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣讼,死亡現(xiàn)場離奇詭異缺猛,居然都是意外死亡,警方通過查閱死者的電腦和手機椭符,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門荔燎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人销钝,你說我怎么就攤上這事有咨。” “怎么了蒸健?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵座享,是天一觀的道長。 經(jīng)常有香客問我似忧,道長渣叛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任盯捌,我火速辦了婚禮淳衙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己箫攀,他們只是感情好肠牲,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匠童,像睡著了一般埂材。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汤求,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天俏险,我揣著相機與錄音,去河邊找鬼扬绪。 笑死竖独,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挤牛。 我是一名探鬼主播莹痢,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墓赴!你這毒婦竟也來了竞膳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诫硕,失蹤者是張志新(化名)和其女友劉穎坦辟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體章办,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡锉走,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了藕届。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪蹭。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖休偶,靈堂內(nèi)的尸體忽然破棺而出梁厉,到底是詐尸還是另有隱情,我是刑警寧澤椅贱,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布懂算,位于F島的核電站,受9級特大地震影響庇麦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喜德,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一山橄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舍悯,春花似錦航棱、人聲如沸睡雇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽它抱。三九已至,卻和暖如春朴艰,著一層夾襖步出監(jiān)牢的瞬間观蓄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工祠墅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侮穿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓毁嗦,卻偏偏與公主長得像亲茅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狗准,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355