最近學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 用...