(二)Netty中的Channel和ChannelPipeline的運行流程和底層原理

(1)Netty中的ChannelPipeline和Channel分別在Netty中起到什麼作用

首先你需要知道在BIO中是面向字節流或者字符流進行傳輸的,而且BIO中的數據傳輸還是單向的

而在NIO中傳輸數據的時候是面向塊的效率比較高,而且還是雙向的傳輸,並且是面向channel通道進行的

最後在Netty中的是面向管道的,其實就是包裝之後的NIO,一個 Channel 包含了一個 ChannelPipeline, 而 ChannelPipeline 中又維護了一個由 ChannelHandlerContext 組成的雙向鏈表. 這個鏈表的頭是 HeadContext, 鏈表的尾是 TailContext, 並且每個 ChannelHandlerContext 中又關聯着一個 ChannelHandler.
在這裏插入圖片描述
在這裏插入圖片描述

(2)看完上面的圖和解釋,你大概也就差不多基本知道了Netty中channel的內部大體的結構了。

先分別來說一下他們幾個核心的名次都是幹嘛的吧

1. 先來說一下Channel接口

  • 其實我認爲這個Channel就是一個大的通道(就想一個地下通道,這個地下通道都是由一個一個的管道來進行通信或者說運輸的),而裏面的管道其實就是ChannelPipeline了。

2. 然後說一下ChannelPipeline接口:

  • ChannelPipeline其實裏面是又很多個ChannelHandler來組成的,以第一個ChannelHandler作爲入站的頭部,出站作爲尾部,其每一個節點都是一個ChannelHandler。
  • 而且在ChannelPipeline中它可以刪除和添加任意一個ChannelHandler,而且可以訪問ChannelHandler。
  • ChannelPipeline 保存了與 Channel 相關聯的 ChannelHandler
    在這裏插入圖片描述

3.再來說一下ChannelHandler接口吧:

  • 他是都是通過它的 EventLoop(I/O 線程)來處理傳遞給它的事件的。所以至關重要的是不要阻塞這個線程,因爲這會對整體的 I/O 處理產生負面的影響

4.然後是ChannelHandlerContext接口:

  • 你得知道ChannelHandlerContext它其實是代表了ChannelHandler和ChannelPipeline之間的關聯,每當有ChannelHandler添加到ChannelPipeline中時,都會創建一個ChannelHandlerContext。
  • 一個 ChannelHandler 可以從屬於多個 ChannelPipeline,所以它也可以綁定到多個 ChannelHandlerContext 實例。對於這種用法指在多個ChannelPipeline 中共享同一個 ChannelHandler,對應的 ChannelHandler 必須要使@Sharable 註解標註;否則,試圖將它添加到多個 ChannelPipeline 時將會觸發異常(高級用法)

這是他們幾個之間串起來的關係:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章