解鎖網路程式設計之NIO的前世今生

2021-09-30 00:11:10 字數 3995 閱讀 4638

個人部落格網:    (你想要這裡多有)

nio 內容概覽:

nio :又叫non-blocking i/o或new i/o;全新的輸入輸出標準庫;

做為原始i/o的補充,為了高效能和高併發的場景使用。

模型:對事物共性的抽象;

程式設計模型:對程式設計共性的抽象;

服務端為每乙個客戶端建乙個執行緒,一旦客戶端請求過多,服務端執行緒數量也會增多,服務端壓力增大。

基於非阻塞 i/o , 設計應對高併發場景程式設計模型

**分析:nio架構中,客戶端的個數與伺服器端的執行緒數呈m:1的關係

第一步:註冊連線並提供服務:selector 中初始化註冊並建立連線事件,提供給client建立連線的服務;client通過selector連線與acceptorhandler 傳送建立客戶端的連線,並又acceptorhandler方法返回響應結果;同時該acceptorhandler方法向selector中註冊可讀事件(client連線客戶端成功後)

第二步:提供服務:client 傳送請求,selector中對註冊狀態及客戶端可讀性驗證,正常情況下,已通過第一步,所以直接連線到處理器進行讀寫操作,根據需求執行業務邏輯,並響應給客戶;

第三步:客戶端連線可讀,在向client響應客戶端請求後,註冊連線可讀事件到selector 中,所註冊的是具體執行業務的handler

非阻塞io模型,伺服器端提供乙個單執行緒的selector來統一管理所有客戶端接入的連線,並負責監聽每個連線所關心的事件

彈性伸縮能力加強,伺服器端乙個執行緒處理所有客戶端的連線請求,客戶端的個數與伺服器端的執行緒數呈m比1的關係

單執行緒節省資源,避免了執行緒的頻繁建立和銷毀,同時也避免了多個執行緒之間上下文的切換,提高了執行效率

nio核心

channel具有雙向性、非阻塞性、操作唯一性。

channel是資訊傳輸的通道,是jdk nio中對輸入輸出方法的另一種抽象,模擬io中的流,與流不同之處在於,channel具有雙向性,而流是單向傳輸的,乙個流必須是inputstream或outputstream的子類,而通道可以用於讀寫或二者同時進行。channel可以工作在非阻塞模式下,構成nio的基礎。在nio中,操作channel的唯一方式是使用buffer,通過buffer操作channel,實現資料塊的傳輸。

channel的實現:

檔案類:filechannel,用於對檔案的讀寫

udp類:datagramchannel, 用於udp的資料讀寫

tcp類:serversocketchannel/socketchannel,用於tcp的資料讀寫

socket的使用:

channel的使用:

buffer:緩衝區,它提供唯一與channel進行互動的方式,作用是讀寫channel中的資料。buffer從本質上說是一塊記憶體區域,它是一塊可以寫入資料,讀取資料的記憶體。

buffer的屬性

capacity:分配的buffer容量,一旦寫入的最大位元組數超過這個容量,需要將其清空之後,才能繼續往裡面寫資料

position:當前操作的位置,初始值為0,最大值:容量值-1

limit:上限,寫模式下等於capacity,讀模式下等於最多能讀取的資料

mark:標記,記錄mark的位置,呼叫reset方法時position會回到mark的位置

buffer的使用:

/*

* 初始化長度為10的byte型別 buffer

* 向bytebuffer中寫入三個位元組

* 將bytebuffer從寫模式切換成讀模式

* 將b先呼叫get方法讀取下乙個位元組

* 再呼叫reset方法將position重置到mark位置

* 呼叫clear方法,將所有屬性重置

selector 選擇器/多路復用器作用:i/o就緒選擇

地位:nio網路程式設計的基礎

selectionkey 選擇鍵

四種就緒狀態常量:連線就緒、接受就緒、讀就緒、寫就緒

selector的使用:最重要的應該就是**片段3:在這一步對就緒事件進行監聽,如果一直不通過,就一直阻塞等待,直到有就緒事件發生,並註冊通過檢測有效,方才放行

第一步:建立selector

第二步:建立serversocketchannel,並繫結監聽埠

第三步:將channel設定為非阻塞模式

第四步:將channel註冊到selector上,監聽連線事件

第五步:迴圈呼叫selector的select方法,檢測就緒情況

第六步:呼叫selectedkeys方法獲取就緒channel集合

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

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

碼雲:

網路程式設計的前世今生

2003年9月,hibernate開發團隊進入jboss公司。可以使用jndi資料來源,也可以直接利用jdbc對資料庫進行操作。定位是乙個持久層框架。2004年,ngnix推出,致力於成為乙個高效能的http和反向 伺服器。2004年3月,spring1.0版本發布。隨之推出的有建立在http協議上...

網際網路的前世今生

網際網路的前世今生 未完成的分析 malefactor 2004年3月 1 網際網路的優勢之一是改變了傳統的人際交流方式.傳統的人際交流方式小地域直接接觸交流 託人代口信,書信 隨著技術的發展出現了比較方便的長程交流方式比如電報,的發展也經過了短程向長程 固定向移動的發展 這樣可以隨時隨地和世界上任...

網際網路的前世今生

網際網路的前世今生 未完成的分析 malefactor 2004年3月 1 網際網路的優勢之一是改變了傳統的人際交流方式.可見隨著人類文明的發展,人際交流方式的發展方向是如下的 a.從單人向雙人再向多人交流的方向發展.b.從文字向聲音再向影像等多 融合的方向發展.c.時間角度從長時間才能建立起來人際...