ChannelPipeline是Netty中很是核心的概念。每一個Netty SocketChannel包含一個ChannelPipeline。markdown
ChannelPipeline包含ChannelHandler實例的list。當數據移入和移出SocketChannel時,將調用這些ChannelHandler實例。數據結構
ChannelHandler接口具備兩個子接口:ide
能夠將ChannelInboundHandler和ChannelOutboundHandler實例都添加到Netty ChannelPipeline。編碼
從SocketChannel接收到數據後,該數據將傳遞到ChannelPipeline中的第一個ChannelInboundHandler。此ChannelInboundHandler處理數據,而後將數據傳遞到ChannelPipeline中的下一個ChannelInboundHandler。3d
實際上,ChannelInboundHandler能夠在將接收到的數據傳遞到管道中的下一個處理器以前對其進行轉換。例如,原始的字節能夠轉換爲HTTP對象或其餘一些對象。而後,管道中的下一個處理器將看到HTTP對象,而非原始數據。netty
當將數據寫回到SocketChannel時,它以相同方式發生。數據從ChannelOutboundHandler傳遞到ChannelPipeline中的ChannelOutboundHandler,直到到達SocketChannel。 ChannelOutboundHandler實例還能夠轉換流程中的數據。對象
儘管該圖將ChannelInboundHandler和ChannelOutboundHandler實例顯示爲單獨的列表,但它們實際上位於同一list(管道)中。blog
Netty編解碼器對象實際上只是一個(或兩個)ChannelHandler實現。編解碼器一般由將請求字節轉換爲對象的ChannelInboundHandler實現和將響應對象轉換爲字節的ChannelOutboundHandler組成。接口
Netty隨附了幾種不一樣協議的編解碼器,例如HTTP,WebSocket,SSL / TLS等。爲了將這些協議與Netty一塊兒使用,您必須將相應的協議編解碼器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中協議。事件
pipeline在建立Channel的時候被建立
Pipeline節點數據結構: ChannelHandlerContext
看看其一個實現類
基本數據結構組件
Pipeline中的兩大哨兵: head和tail
先看看用戶代碼
判斷是否重複添加
同理之後的過程
最佳實踐
調用 pipeline 添加節點時,netty 會使用 instanceof 關鍵字判斷當前節點是 inboound 仍是 outbound 類型,分別用不一樣的 boolean 類型變量標識
inbound 事件類型順序正相關
outbound 逆相關 異常處理器要麼從 head 或者 tail 節點開始傳播 inbound事件則從當前節點開始傳遞到最後節點 outbound事件則從當前節點開始傳遞 到第一個 outbound節點