(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 時將會觸發異常(高級用法)
這是他們幾個之間串起來的關係: