參考來源
需要搞明白的問題
1.什么是inbound和outbound
outbound:對于socket write操作,將會從Tail--》Head依次執(zhí)行pipeline中的每個Encoder
inbound:對于read操作,將會從Head--》Tail依次執(zhí)行Decoder2.對pipeline添加ChannelHandler的時候應(yīng)該注意什么?
需要注意添加channelHandler的順序3.理解Netty的"異步"
NIO,即Non Blocking IO,非阻塞IO,在JAVA中NIO的核心就是Selector機制。簡單而言,創(chuàng)建一個Socket Channel,并將其注冊到一個Selector上(多路復(fù)用器),這個Selector將會“關(guān)注”Channel上發(fā)生的IO讀寫事件,并在事件發(fā)生(數(shù)據(jù)就緒)后執(zhí)行相關(guān)的處理邏輯。對于阻塞IO,它需要在read()、write()操作上阻塞而直到數(shù)據(jù)操作完畢,但是NIO則不需要,只有當(dāng)Selector檢測到此Channel上有事件時才會觸發(fā)調(diào)用read、write操作。
但是NIO并不是嚴格意義上的“異步IO”(Asynchronous),最大的原因就是Selector本身是阻塞的!!即selector需要通過線程阻塞的方式(其select方法)獲取底層通道的事件變更,然后獲取SelectionKey列表;那么對于“異步IO”(概念同JDK 7的AIO)在整個操作鏈路上均不需要任何阻塞(完全基于OS的IO事件),依賴基于事件驅(qū)動的Handler做數(shù)據(jù)處理。目前Netty尚沒有集成AIO的相關(guān)特性,即Netty本身為非阻塞IO框架4.關(guān)于inbound和oubound注釋圖
- Paste_Image.png
很多解釋上喜歡用這張圖,讓人費解,搞不清楚那邊是頭那邊是尾
