NIO流程記錄 非原始碼,單reacter單執行緒

2021-10-07 22:22:48 字數 1578 閱讀 5889

最近學netty,順便把nio學了,做個記錄(需要有基礎)

我的理解

原來io流當獲取資料時,會保持阻塞狀態,現在改為nio非阻塞,那我不在這一直等著,我怎麼知道什麼時候他來資料,這時出來乙個selector,充當***,可以選擇隔一段時間來看有沒有客戶端傳來資料,在這裡,所有傳送的請求被封裝成了乙個key,相當於,你現在可以有好多個客戶端同時給伺服器傳送請求,請求全部堆在channel中,你selector什麼時候有空了就來看下,然後取出所有的key,一下處理好多個請求,這就是nio主要做的

深入理解

為什麼將serversocketchannel也註冊到了selector上

其實ssc.register,將乙個serversocketchannel註冊到selector上,也就是說,此時伺服器也當作乙個普通的channel註冊到selector上,並且這個監聽的事件是accept,也就是說當有客戶端連線時,你可以在key集合中判斷這個鏈結是不是最初建立的(selectionkey.isacceptable()),如果是,那麼你就要為這個最初生成的通道建立一些東西了,建立乙個socketchannel,並註冊到selector上,注意一般ssc才會註冊accept,我們客戶端和服務端一般都是監聽read,wright並不需要監聽,你需要寫時就寫就行了

上面說了情況是你將ssc註冊到了selector上了,當然你也可以自己想象下,乙個客戶端來時你本來就要為其accept()乙個通道,這裡這是交給了selecor處理這個accept監聽,然後在上圖的模組處理,本質沒有什麼區別

客戶端為什麼也要寫selector

因為,客戶端需要非阻塞監聽伺服器傳送過來的資料時,也必須建立乙個***,所以也要建立

channel通道可以互不影響的雙向傳輸資料嗎

是的,伺服器向公共channel裡新增資料,此時會在客戶端對應channel的selector上出現乙個read事件,你可以獲取selectorkey處理此次事件,同時客戶端向公共channel裡新增資料,也會在服務端端對應channel的selector上出現乙個read事件,兩者互不影響,就像bio裡你開了socket後獲取的input和output一樣,兩者互不影響

注意事項

每次處理完乙個selectorkey時一定不要忘記去除此事件,即使在客戶端,

向buffer中put資料後,一定要flip,轉換模式

你可以selector.selectedkeys()獲取所有註冊的通道,但是別忘了其中還有乙個serversocketchannel,與其他socketchannel不同,需要單獨處理

總結:一句話,建立個selector監聽,什麼時候有訊號了處理就行,一開始時先建立servicesocketchannel繫結在這個selector上accepter

mapreduce job提交原始碼流程

waitforcompletion submit 1建立連線 connect 1 建立提交job的 newcluster getconfiguration 1 判斷是本地yarn還是遠端 initialize jobtrackaddr,conf 2 提交job submitter.submitjob...

flask Local原始碼流程解析

flask中local原始碼資料型別 首先明確 原始碼中要構造的資料型別數是這樣的 storage 其次原始碼用local類構造資料型別,然後又用localstack類,作用是操作local,讓我們使用起來更方便,localstack類中封裝了push方法,用來給呼叫local新增資料,pop方法取...

lucene update流程原始碼分析

update操作buffer到documentswriterdeletequeue裡,flush時處理deletes.documentswriterdeletequeue使用global deleteslice和dwpt deleteslice儲存deletes。dwpt deleteslice 用...