NIO學(xué)習(xí)總結(jié)

NIO

NIO稱(chēng)為Non-blocking I/O 或 New I/O,就是非阻塞IO或者新IO

BIO網(wǎng)絡(luò)模型

1561534656(1).png
1561534609(1).png

由圖看出BIO每次建立一個(gè)新連接都需要新建一個(gè)線(xiàn)程處理。且隨著線(xiàn)程數(shù)量的增加硬爆,CPU切換線(xiàn)程上下文的消耗也隨之增加。

NIO網(wǎng)絡(luò)模型

1561535728(1).png

而NIO則通過(guò)selector統(tǒng)一接受注冊(cè)事件,再通過(guò)輪循的方式檢測(cè)事件注冊(cè)情況俯树。

NIO核心類(lèi)

Channel:通道
Buffer:緩沖區(qū)(負(fù)責(zé)與通道進(jìn)行通訊)
Selector:選擇器 或 多路復(fù)用器

Channel簡(jiǎn)介

1.Channel負(fù)責(zé)傳輸信息,特點(diǎn)是雙向傳輸丸冕。相比與BIO的流來(lái)說(shuō)流是單向傳輸赠摇。
2.Channe是非阻塞的
3.操作Channel的唯一方式是Buffer超燃。

Channel代碼操作

// 代碼片段 1:服務(wù)器端通過(guò)服務(wù)器socket創(chuàng)建channel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 代碼片段 2:服務(wù)器端綁定端口
serverSocketChannel.bind(new InetSocketAddress(8000));
// 代碼片段 3:服務(wù)器端監(jiān)聽(tīng)客戶(hù)端連接区拳,建立socketChannel連接
SocketChannel socketChannel = serverSocketChannel.accept();
// 代買(mǎi)片段 4:客戶(hù)端連接遠(yuǎn)程主機(jī)及端口
SocketChannel socketChannel = SocketChannel.open(
    new InetSocketAddress("127.0.0.1", 8000))

Buffer簡(jiǎn)介

? 提供唯一與Channel進(jìn)行交互的方式拘领。
作用:讀寫(xiě)Channel中的數(shù)據(jù)
本質(zhì):一塊可以從中讀取或?qū)懭氲膬?nèi)存區(qū)域意乓。被NIO包裝成一個(gè)NIO Buffer對(duì)象,并提供一組便于操作內(nèi)存的方法。

Buffer屬性

(1)Capacity:容量届良。
標(biāo)明數(shù)組可以容納的最大字節(jié)長(zhǎng)度笆凌,若超出容量,則需要將其清空后才能重新寫(xiě)入士葫。
(2)Position:位置
寫(xiě)模式:表示當(dāng)前的位置乞而,初始位置為0,最大值為 Capacity-1
讀模式:重置為0
(3)Limit:上限
寫(xiě)模式:最多能往Buffer中寫(xiě)的數(shù)據(jù)數(shù)量慢显,此時(shí)等于Capacity
讀模式:此時(shí)等于寫(xiě)模式下的Position值爪模。
(4)Mark:標(biāo)記
標(biāo)記一個(gè)特定Position位置,可通過(guò)Buffer的Reset()方法恢復(fù)到標(biāo)記位置荚藻。

Buffer使用

// 初始化長(zhǎng)度為10的byte類(lèi)型Buffer
ByteBuffer.allocate(10);
// 向byteBuffer中寫(xiě)入三個(gè)字節(jié)
byteBuffer.put("abc".getBytes(Charset.forName("UTF-8")));
// 將byteBuffer從寫(xiě)模式切換成讀模式
byteBuffer.flip();
// 從byteBuffer中讀取一個(gè)字節(jié)
byteBuffer.get();
// 調(diào)用mark方法記錄下當(dāng)前position的位置
byteBuffer.mark();
// 先調(diào)用get方法讀取下一個(gè)字節(jié)
byteBuffer.get()
// 再調(diào)用reset()方法將position重置到mark位置
byteBuffer.reset()
// 調(diào)用clear方法屋灌,將所有屬性重置
byteBuffer.clear()

Selector簡(jiǎn)介

負(fù)責(zé)處理所有的客戶(hù)端注冊(cè),管理多個(gè)Channel应狱。

Selector使用

// 代碼片段 1:創(chuàng)建Selector
Selector selector = Selector.open();
// 代碼片段 2:將channel注冊(cè)到selector上共郭,監(jiān)聽(tīng)讀就緒事件
SelectionKey selectionKey = channel.register(selector, SelectionKey.OP_READ);
// 代碼片段 3:阻塞等待channel的就緒事件發(fā)生
int selectNum = selector.select();
// 代碼片段 4:獲取發(fā)生就緒事件的channel集合
Set<SelectionKey> selectedKeys = selector.selectedKeys();

SelectionKey簡(jiǎn)介

(1)四種就緒狀態(tài)常量

SelectionKey常量提供了四個(gè)可監(jiān)聽(tīng)事件的靜態(tài)常量值。

OP_CONNECT:連接就緒疾呻。連接操作除嘹,Client端支持的一種操作
OP_ACCEPT:接收就緒。連接可接受操作岸蜗,僅ServerSocketChannel支持
OP_READ:讀就緒尉咕。
OP_WRITE:寫(xiě)就緒。
(2)可以獲取有價(jià)值的屬性

在調(diào)用Selector對(duì)象的SelectedKey方法時(shí)璃岳,會(huì)返回一個(gè)SelectionKey的集合龙考。可以通過(guò)這個(gè)SelectionKey的集合獲取當(dāng)前的Channel矾睦、當(dāng)前Selector的對(duì)象晦款、Channel已就緒事件集合和所關(guān)心事件集合。

ps:本文大部分內(nèi)容參考于https://blog.csdn.net/qq_28303495/article/details/89514690枚冗,他寫(xiě)的比我更加詳細(xì)缓溅,此文只為自己學(xué)習(xí)作一個(gè)總結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赁温,一起剝皮案震驚了整個(gè)濱河市坛怪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌股囊,老刑警劉巖袜匿,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異稚疹,居然都是意外死亡居灯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怪嫌,“玉大人义锥,你說(shuō)我怎么就攤上這事⊙颐穑” “怎么了拌倍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)噪径。 經(jīng)常有香客問(wèn)我柱恤,道長(zhǎng),這世上最難降的妖魔是什么找爱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任膨更,我火速辦了婚禮,結(jié)果婚禮上缴允,老公的妹妹穿的比我還像新娘荚守。我一直安慰自己,他們只是感情好练般,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布矗漾。 她就那樣靜靜地躺著,像睡著了一般薄料。 火紅的嫁衣襯著肌膚如雪敞贡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天摄职,我揣著相機(jī)與錄音誊役,去河邊找鬼。 笑死谷市,一個(gè)胖子當(dāng)著我的面吹牛蛔垢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迫悠,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹏漆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了创泄?” 一聲冷哼從身側(cè)響起艺玲,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞠抑,沒(méi)想到半個(gè)月后饭聚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搁拙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年秒梳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了法绵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡端幼,死狀恐怖礼烈,靈堂內(nèi)的尸體忽然破棺而出弧满,到底是詐尸還是另有隱情婆跑,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布庭呜,位于F島的核電站滑进,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏募谎。R本人自食惡果不足惜扶关,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望数冬。 院中可真熱鬧节槐,春花似錦、人聲如沸拐纱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秸架。三九已至揍庄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間东抹,已是汗流浹背蚂子。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缭黔,地道東北人食茎。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像馏谨,于是被迫代替她去往敵國(guó)和親董瞻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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