日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

NIO編程一直是JAVA知識體系中的一個重點。前幾年的時間面試的門檻是了解NIO,現在就不一樣了,最起碼也要精通NIO,因此學習javaNIO編程是非常有必要的。這篇文章就開始對NIO進行一個認識。本文參考了慕課網,特在此說明。

一、認識NIO

1、什么是BIO?

想要學習NIO,那我們就必須先要認識一下BIO,在JDK1,4之前,我們使用網絡連接的時候一直都是使用的BIO,也就是阻塞式,網絡模型是下面這個樣子的。

這篇java的NIO編程,保證你能看懂

 

上面這個網絡模型是這樣的。

(1)server創建初始化一些預備工作之后,就開始等待客戶端client的鏈接

(2)client開始鏈接server。

(3)server一旦請求到client的請求之后就會開啟一個線程去處理。

就好比是只有一家餐飲店,每進來一個顧客,我們就需要去創建一個線程去處理。這就是BIO。他的缺點可想而知。如果客戶端很多的話,server就必須要開啟很多個Thread去處理,這樣也太麻煩了。畢竟像淘寶微信這樣的平臺好幾億人再用,而且請求量這么大,總不能開啟幾億個線程去處理吧。這時候在jdk1.4就出現了NIO。

2、出現了NIO

既然BIO有這么多的缺點,java官方肯定也明白,于是在jdk1.4的時候及時的加入了NIO。

這篇java的NIO編程,保證你能看懂

 

這個跟上一個的區別我們來捋一下:

(1)一個客戶端進來之后首先加入到Set中

(2)server時刻輪詢著這個set,一旦發現有客戶端連接進來就開始handler

(3)多個client連接進來的時候,都保存在這個set中,這樣我們就可以輪詢處理多個client了。

這就NIO,他的優點從上面的圖也可以看出來。我們可能只需要創建一個Thread就可以處理所有的client了。當然每一個client要做的事情不一樣,有的是連接請求,有的是讀寫請求,這時候server就可以根據不同的請求使用不同的handler了。再給出一張圖看一下:

這篇java的NIO編程,保證你能看懂

 

當然,這只是列舉出了NIO的特點,還有大致網絡模型,想要去真正的了解他,還是代碼來的直接。

二、代碼實現

1、基本概念

在正式開始代碼的編寫之前,我們還要先認識一下涉及到的幾個類。

(1)channel

它相當于是一個通道,這個通道是流通數據的,我們既可以從通道中讀取數據,又可以寫數據到通道。常見的channel有四個:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel。

  • FileChannel 從文件中讀寫數據。
  • DatagramChannel 能通過UDP讀寫網絡中的數據。
  • SocketChannel 能通過TCP讀寫網絡中的數據。
  • ServerSocketChannel可以監聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創建一個SocketChannel。

(2)Buffer

Buffer用于和通道進行交互。數據是從通道讀入緩沖區,從緩沖區寫入到通道中的。

這篇java的NIO編程,保證你能看懂

 

使用Buffer讀寫數據一般遵循以下四個步驟:

  1. 寫入數據到Buffer
  2. 調用flip()方法
  3. 從Buffer中讀取數據
  4. 調用clear()方法或者compact()方法

(3)Selector

Selector(選擇器)能夠檢測一到多個NIO通道,并能夠知曉通道是否為諸如讀寫事件做好準備的組件。這樣,一個單獨的線程可以管理多個channel,從而管理多個網絡連接。

這篇java的NIO編程,保證你能看懂

 

2、實現步驟

我們在這里實現一個類似于聊天室的案例,上面已經把NIO涉及到的一些核心類說了一下,下面說一下實現的步驟。這個步驟是要結合上面的圖來理解會比較容易一些:

第一步:創建Selector

第二步:創建ServerSocketChannel,綁定監聽端口

第三步:將Channel設置為非阻塞模式

第四步:將Channel注冊到Selector上,監聽連接事件

第五步:循環調用Selector的select方法,檢測就緒情況

第六步:調用selectedKeys方法獲取就緒channel集合

第七步:判斷就緒事件種類,調用業務處理方法

第八步:根據業務需要決定是否再次注冊監聽事件,重復執行第三步操作

有了這個步驟我們再去代碼實現。

3、代碼實現

(1)server端代碼開發

首先我們看一下服務器端

這篇java的NIO編程,保證你能看懂

 

 

這篇java的NIO編程,保證你能看懂

 

上面把server中基本的是步驟實現了。現在開始真正的去處理一下。

第一種情況:鏈接事件處理

這篇java的NIO編程,保證你能看懂

 

第二種情況:讀寫時間處理

這篇java的NIO編程,保證你能看懂

 

到了第五步broadCast方法其實我們可以對此進行一個變化,在這里我們實現的是廣播到其他所有client。但是如果是一對一聊天的話我們就可以單播到指定client。

這篇java的NIO編程,保證你能看懂

 

這就是整個服務器端的開發,當然還要客戶端的開發,我們同樣來看看。

(2)client端代碼開發

客戶端代碼說實話就比較輕松一點了。

這篇java的NIO編程,保證你能看懂

 

我們就再來看看,客戶端如何處理服務器端返回的數據。

這篇java的NIO編程,保證你能看懂

 

readHandler方法是如何讀取呢?

這篇java的NIO編程,保證你能看懂

 

到這一步,整個客戶端的代碼就算是完成了,如果你仔細的捋一遍,其實整個流程還是很清晰的。

三、總結

雖然NIO這么好其實還是有很多缺點的,在上面的代碼量其實你就可以發現了,大量的代碼使得我們在構建復雜系統的時候超級麻煩,有時候正是這些技術的不完備,才造成了我們程序員工作量大,壓力大,但是科技的進步畢竟是要一點一點發展的嘛。另外說一句這個NIO還有一個大坑,就是Selector空輪詢的時候,導師CPU100%。不過這種情況我還沒試過。

想要精通NIO的話,這篇文章真的遠遠不夠,頂多算是入門把。想要真正認識我覺得首先要深入源碼,然后就是實際場景中的使用,不過目前來看的話netty和mina框架要比java的NIO好的多,不單單是性能,更重要的是我們的開發效率。算是在一定程度上避免了我們程序員“錢多話少死得快”的現象了吧。

分享到:
標簽:編程 java NIO
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定