Java的Channel對比Netty的Channel


java中的Channel抽象

三層抽象

  • 第一層:Channel層只是抽象了channel最頂層的兩個方法
  • 第二層:可選的Channel抽象,只抽象了Channel跟Selector的交互
  • 第三層:直接的具體抽象,以Socket為例,SocketChannel是用戶讀寫數據的,ServerSocketChannel是用於創建SocketChannel,所以兩者其實看起來沒有啥可公共抽象的

Netty中的Channel抽象

四層抽象

  • 第一層:channel層抽象抽象了所有Channel的公共行為,不管是客戶端服務端。包含的是Netty本身設計的一些抽象,比如Channel會有id,每個Channel都會綁定一個EventLoop、一個ChannelPipeline、一個ChannelConfig,底層使用Unsafe進行實際傳輸。
  • 第二層:NIO抽象對NIO層的行為進行抽象,比如NIO都會有一個SelectableChannel進行實際處理,都會得到一個SelectionKey
  • 第三層:讀寫層抽象,這里已經限定在了NIO中,以Socket為例:客戶端讀寫的是ByteBuffer,服務端用於接受鏈接,可以抽象成讀到的是Channel,因此分為了實際數據的讀寫的Channel和讀取消息的服務端Channel,比如在NIO的服務端,讀取的消息就是創建的Channel。
  • 第四層:具體實現消息讀寫、連接、綁定等

總結

  • 從宏觀上理解,Netty的Channel更具業務能力,我們在很多地方可以直接傳遞Channel,就可以直接得到關聯的組件。同時,他的分層也比較適合層層遞進,從全局Channel到NIO層抽象,再到讀寫層,再到具體應用,每一層的抽象極致復用到下一層。
  • Java本身的抽象,在具體實現層承載了幾乎全部的實際Channel能力,沒有在客戶端服務端上進行抽象。
  • Netty的讀寫層抽象得益於一個巧妙的想法:服務端讀取的是Channel,客戶端讀取的是ByteBuffer,可以抽象層出都是讀取消息
  • Netty的Channel是依賴與Java的Channel的,本身還是只是封裝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM