Java NIO

說到netty朽砰,不得不提的一個(gè)就是Java NIO拂封。本文主要介紹JAVA NIO涉及到的一些基礎(chǔ)概念以及對(duì)JAVA NIO的開發(fā)過程進(jìn)行簡單介紹。

基本概念

Java NIO,一般稱為非阻塞IO庶柿,它基于多路復(fù)用模型棉胀。它有三個(gè)基本的概念:Channel(通道)法瑟,Buffer(緩沖區(qū)),Selector(多路復(fù)用器)唁奢。

channel 通道

channel是一個(gè)全雙工通道霎挟,不同于的流的地方,它可以同時(shí)用于讀和寫麻掸。因?yàn)樗侨p工的酥夭,可以比流更好地映射底層操作系統(tǒng)的API,它代表了一個(gè)面向流的可監(jiān)聽讀寫事件的socket脊奋。 channel主要分為兩大類采郎,分別是用于網(wǎng)絡(luò)讀寫的SelectableChannel和用于文件讀寫的FileChannel,其中SelectableChannel又提供了兩個(gè)子類狂魔,分別是面向服務(wù)端的ServerSocketChannel和面向SocketChannel蒜埋。

Buffer 緩沖區(qū)

在 Java NIO中,所有的數(shù)據(jù)都是通過緩沖區(qū)進(jìn)行處理的最楷。在讀取的時(shí)候整份,將數(shù)據(jù)讀取到緩沖區(qū)待错;在寫入數(shù)據(jù)時(shí),也是將數(shù)據(jù)寫入到緩沖區(qū)的烈评。最常用是緩沖區(qū)是ByteBuffer火俄。

Selector

Selector是Java NIO中的多路復(fù)用器。 它的主要作用就是提供已經(jīng)就緒的任務(wù)讲冠,Selector會(huì)不斷輪詢注冊在其上的Channel瓜客,如果某個(gè)Channel上有新的連接接入、讀和寫事件竿开,這個(gè)Channel就會(huì)被輪詢出來谱仪,然后通過SelectionKey可以獲取整個(gè)就緒的Channel集合,進(jìn)行后續(xù)的IO操作否彩。

可以將多個(gè)Channel注冊到一個(gè)Selector上疯攒,使用一個(gè)線程處理所有的IO事件,也可以將多個(gè)Channel注冊到多個(gè)Selector實(shí)例上列荔,利用多線程的高性能處理IO事件敬尺。

編程步驟

服務(wù)端

Java NIO提供的API較為繁瑣,此處就不上代碼了贴浙,對(duì)于多路復(fù)用模型砂吞,服務(wù)端和前文中使用python編寫的過程很類似,主要有以下幾點(diǎn):

  • 創(chuàng)建一個(gè)負(fù)責(zé)監(jiān)聽新連接的socket
  • 通過系統(tǒng)調(diào)用得到一個(gè)處于就緒狀態(tài)的連接集合
  • 創(chuàng)建一個(gè)循環(huán)用來輪詢這個(gè)集合
  • 判斷事件類型崎溃。如果是Accept呜舒,則創(chuàng)建新的連接并為其注冊事件,如果是讀寫數(shù)據(jù)笨奠,則作讀寫處理

下面是Java NIO服務(wù)端端的序列圖:

  1. 創(chuàng)建ServerSocketChannel袭蝗,設(shè)置為非阻塞模式
  2. 設(shè)置ServerSocketChannel參數(shù),綁定監(jiān)聽地址
  3. 創(chuàng)建一個(gè)線程般婆,用來輪詢多路復(fù)用器Selector
  4. 將ServerSocketChannel注冊到Selector到腥,監(jiān)聽SelectionKey.Accept事件
  5. 在循環(huán)中使用Selector.select()獲取就緒狀態(tài)的channel,對(duì)事件類型進(jìn)行判斷:
    • 如果是Accept事件蔚袍,則調(diào)用ServerSocketChannel.accept()創(chuàng)建新的客戶端連接乡范,將其設(shè)置成非阻塞模式,并注冊到Selector監(jiān)聽感興趣的操作(read啤咽、write)
    • 如果是Read事件晋辆,則需構(gòu)造ByteBuffer對(duì)象,讀取數(shù)據(jù)包
    • 如果是Write事件宇整,則繼續(xù)發(fā)送數(shù)據(jù)包

客戶端

  1. 創(chuàng)建SocketChannel瓶佳,設(shè)置成非阻塞,設(shè)置Tcp參數(shù)
  2. 連接服務(wù)端鳞青,如果連接成功霸饲,則向selector注冊讀寫事件为朋,進(jìn)行IO操作
  3. 如果連接失敗,則向selector注冊CONNECT事件厚脉,輪詢處理习寸。

總結(jié)

Java NIO提供的接口使用起來較為復(fù)雜,netty封裝了更為簡單的方法傻工,并且netty自身的線程模型也是實(shí)現(xiàn)更性能的關(guān)鍵霞溪,后面會(huì)做介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末中捆,一起剝皮案震驚了整個(gè)濱河市鸯匹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轨香,老刑警劉巖忽你,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幼东,死亡現(xiàn)場離奇詭異臂容,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)根蟹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門脓杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人简逮,你說我怎么就攤上這事球散。” “怎么了散庶?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蕉堰,是天一觀的道長。 經(jīng)常有香客問我悲龟,道長屋讶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任须教,我火速辦了婚禮皿渗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轻腺。我一直安慰自己乐疆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布贬养。 她就那樣靜靜地躺著挤土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误算。 梳的紋絲不亂的頭發(fā)上耕挨,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天细卧,我揣著相機(jī)與錄音,去河邊找鬼筒占。 笑死贪庙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翰苫。 我是一名探鬼主播止邮,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奏窑!你這毒婦竟也來了导披?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤埃唯,失蹤者是張志新(化名)和其女友劉穎撩匕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨叛,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡止毕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漠趁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扁凛。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闯传,靈堂內(nèi)的尸體忽然破棺而出谨朝,到底是詐尸還是另有隱情,我是刑警寧澤甥绿,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布字币,位于F島的核電站,受9級(jí)特大地震影響共缕,放射性物質(zhì)發(fā)生泄漏洗出。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一骄呼、第九天 我趴在偏房一處隱蔽的房頂上張望共苛。 院中可真熱鬧,春花似錦蜓萄、人聲如沸隅茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辟犀。三九已至,卻和暖如春绸硕,著一層夾襖步出監(jiān)牢的瞬間堂竟,已是汗流浹背魂毁。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留出嘹,地道東北人席楚。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像税稼,于是被迫代替她去往敵國和親烦秩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API郎仆,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,555評(píng)論 1 143
  • 簡介 Java NIO 是由 Java 1.4 引進(jìn)的異步 IO.Java NIO 由以下幾個(gè)核心部分組成: Ch...
    永順閱讀 1,792評(píng)論 0 15
  • 概述 NIO主要有三大核心部分:Channel(通道)只祠,Buffer(緩沖區(qū)),Selector。 傳統(tǒng)IO基于...
    時(shí)之令閱讀 3,690評(píng)論 0 8
  • 前言: 之前的文章《Java文件IO常用歸納》主要寫了Java 標(biāo)準(zhǔn)IO要注意的細(xì)節(jié)和技巧扰肌,由于網(wǎng)上各種學(xué)習(xí)途徑抛寝,...
    androidjp閱讀 2,907評(píng)論 0 22
  • 越過那條長街再轉(zhuǎn)彎 那是以前我常來的地方 誰還傳言和感情的窗 你一直希望對(duì)面是一片海洋 后來聽說你一直想搬 太多寂...
    靜曉懶閱讀 540評(píng)論 0 1