NIO(Non Blocking IO)客戶端服務(wù)端代碼示例分析

同步非阻塞硬爆,服務(wù)器實(shí)現(xiàn)模式為一個(gè)線程可以處理多個(gè)請(qǐng)求(連接)潮改,客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器selector上热康,多路復(fù)用器輪詢到連接有IO請(qǐng)求就進(jìn)行處理讯沈。

I/O多路復(fù)用底層一般用的Linux API(select,poll祝迂,epoll)來(lái)實(shí)現(xiàn)睦尽,他們的區(qū)別如下表:


應(yīng)用場(chǎng)景:

NIO方式適用于連接數(shù)目多且連接比較短(輕操作) 的架構(gòu), 比如聊天服務(wù)器液兽, 彈幕系統(tǒng)骂删, 服務(wù)器間通訊,編程比較復(fù)雜四啰, JDK1.4 開始支持

NIO 有三大核心組件: Channel(通道)宁玫, Buffer(緩沖區(qū)),Selector(選擇器)

1柑晒、channel 類似于流欧瘪,每個(gè) channel 對(duì)應(yīng)一個(gè) buffer緩沖區(qū),buffer 底層就是個(gè)數(shù)組

2匙赞、channel 會(huì)注冊(cè)到 selector 上佛掖,由 selector 根據(jù) channel 讀寫事件的發(fā)生將其交由某個(gè)空閑的線程處理

3、selector 可以對(duì)應(yīng)一個(gè)或多個(gè)線程

4涌庭、NIO 的 Buffer 和 channel 都是既可以讀也可以寫


server端代碼示例:

NIO服務(wù)端程序詳細(xì)分析:

1芥被、創(chuàng)建一個(gè) ServerSocketChannel 和 Selector ,并將 ServerSocketChannel 注冊(cè)到 Selector 上

2坐榆、 selector 通過 select() 方法監(jiān)聽 channel 事件拴魄,當(dāng)客戶端連接時(shí),selector 監(jiān)聽到連接事件席镀, 獲取到 ServerSocketChannel 注冊(cè)時(shí)綁定的 selectionKey

3匹中、selectionKey 通過 channel() 方法可以獲取綁定的 ServerSocketChannel

4、ServerSocketChannel 通過 accept() 方法得到 SocketChannel

5豪诲、將 SocketChannel 注冊(cè)到 Selector 上顶捷,關(guān)心 read 事件

6、注冊(cè)后返回一個(gè) SelectionKey, 會(huì)和該 SocketChannel 關(guān)聯(lián)

7屎篱、selector 繼續(xù)通過 select() 方法監(jiān)聽事件服赎,當(dāng)客戶端發(fā)送數(shù)據(jù)給服務(wù)端,selector 監(jiān)聽到read事件芳室,獲取到 SocketChannel? 注冊(cè)時(shí)綁定的 selectionKey

8专肪、selectionKey 通過 channel() 方法可以獲取綁定的 socketChannel

9、將 socketChannel 里的數(shù)據(jù)讀取出來(lái)

10堪侯、用 socketChannel 將服務(wù)端數(shù)據(jù)寫回客戶端

總結(jié):NIO模型的selector 就像一個(gè)大總管嚎尤,負(fù)責(zé)監(jiān)聽各種IO事件,然后轉(zhuǎn)交給后端線程去處理

NIO相對(duì)于BIO非阻塞的體現(xiàn)就在伍宦,BIO的后端線程需要阻塞等待客戶端寫數(shù)據(jù)(比如read方法)芽死,如果客戶端不寫數(shù)據(jù)線程就要阻塞,NIO把等待客戶端操作的事情交給了大總管 selector次洼,selector 負(fù)責(zé)輪詢所有已注冊(cè)的客戶端关贵,發(fā)現(xiàn)有事件發(fā)生了才轉(zhuǎn)交給后端線程處理,后端線程不需要做任何阻塞等待卖毁,直接處理客戶端事件的數(shù)據(jù)即可揖曾,處理完馬上結(jié)束落萎,或返回線程池供其他客戶端事件繼續(xù)使用。還有就是 channel 的讀寫是非阻塞的炭剪。

Redis就是典型的NIO線程模型练链,selector收集所有連接的事件并且轉(zhuǎn)交給后端線程,

線程連續(xù)執(zhí)行所有事件命令并將結(jié)果寫回客戶端

客戶端代碼示例:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奴拦,一起剝皮案震驚了整個(gè)濱河市媒鼓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌错妖,老刑警劉巖绿鸣,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異暂氯,居然都是意外死亡潮模,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門痴施,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)再登,“玉大人,你說(shuō)我怎么就攤上這事晾剖★笔福” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵齿尽,是天一觀的道長(zhǎng)沽损。 經(jīng)常有香客問我,道長(zhǎng)循头,這世上最難降的妖魔是什么绵估? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮卡骂,結(jié)果婚禮上国裳,老公的妹妹穿的比我還像新娘。我一直安慰自己全跨,他們只是感情好缝左,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浓若,像睡著了一般渺杉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挪钓,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天是越,我揣著相機(jī)與錄音,去河邊找鬼碌上。 笑死倚评,一個(gè)胖子當(dāng)著我的面吹牛浦徊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播天梧,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辑畦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腿倚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚯妇,失蹤者是張志新(化名)和其女友劉穎敷燎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩言,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硬贯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陨收。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭豹。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖务漩,靈堂內(nèi)的尸體忽然破棺而出拄衰,到底是詐尸還是另有隱情,我是刑警寧澤饵骨,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布翘悉,位于F島的核電站,受9級(jí)特大地震影響居触,放射性物質(zhì)發(fā)生泄漏妖混。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一轮洋、第九天 我趴在偏房一處隱蔽的房頂上張望制市。 院中可真熱鬧,春花似錦弊予、人聲如沸祥楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荣堰。三九已至,卻和暖如春竭翠,著一層夾襖步出監(jiān)牢的瞬間振坚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工斋扰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渡八,地道東北人啃洋。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屎鳍,于是被迫代替她去往敵國(guó)和親宏娄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • # Java NIO # Java NIO屬于非阻塞IO逮壁,這是與傳統(tǒng)IO最本質(zhì)的區(qū)別孵坚。傳統(tǒng)IO包括socket和文...
    Teddy_b閱讀 595評(píng)論 0 0
  • Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,555評(píng)論 1 143
  • 概述 NIO主要有三大核心部分:Channel(通道)窥淆,Buffer(緩沖區(qū)),Selector卖宠。 傳統(tǒng)IO基于...
    時(shí)之令閱讀 3,689評(píng)論 0 8
  • 簡(jiǎn)介 Java NIO 是由 Java 1.4 引進(jìn)的異步 IO.Java NIO 由以下幾個(gè)核心部分組成: Ch...
    永順閱讀 1,791評(píng)論 0 15
  • 背景 java.nio全稱java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(...
    ninetyhe_閱讀 418評(píng)論 0 0