Netty 核心: ChannelPipeline

Netty ChannelPipeline是Netty中非常核心的概念。每個SocketChannel包含一個ChannelPipeline。 ChannelPipeline包含ChannelHandler實例的列表。當數據進入和寫出SocketChannel時,將調用這些ChannelHandler實例。

 

ChannelHandler接口具有兩個子接口:

ChannelInboundHandler

ChannelOutboundHandler

 

你可以將ChannelInboundHandler和ChannelOutboundHandler實例都添加到ChannelPipeline。下圖說明了添加了ChannelInboundHandler和ChannelOutboundHandler實例的ChannelPipeline:

channelpipeline-1.png

 

從SocketChannel接收到數據後,該數據將傳遞到ChannelPipeline中的第一個ChannelInboundHandler。此ChannelInboundHandler處理數據,然後將數據傳遞到ChannelPipeline中的下一個ChannelInboundHandler。

實際上,ChannelInboundHandler可以轉換接收到的數據,然後再將其傳遞到管道中的下一個處理程序。例如,原始字節可以轉換爲HTTP對象或其他一些對象。然後,管道中的下一個處理程序將看到HTTP對象,而不是原始數據。

當將數據寫回到SocketChannel時,它以相同的方式發生。數據從ChannelOutboundHandler傳遞到ChannelPipeline中的ChannelOutboundHandler,直到到達SocketChannel。 ChannelOutboundHandler實例還可以轉換流程中的數據。

儘管該圖將ChannelInboundHandler和ChannelOutboundHandler實例顯示爲單獨的列表,但它們實際上位於同一列表(管道)中。因此,如果ChannelInboundHandler決定將某些內容寫回SocketChannel,則數據將通過比ChannelInboundHandler寫入數據更早的ChannelPipeline中位於所有ChannelOutboundHandler實例:

channelpipeline-2.png

 

Codecs

Netty具有編解碼器(編碼器+解碼器)的概念。 Netty編解碼器將字節轉換爲消息對象(Java對象),或將消息對象轉換爲字節。例如,編解碼器可能會將傳入的HTTP請求的原始字節轉換爲HTTP對象,或者將HTTP響應對象轉換回原始字節。

Netty編解碼器對象實際上只是一個(或兩個)ChannelHandler實現。編解碼器通常由將請求字節轉換爲對象的ChannelInboundHandler實現和將響應對象轉換爲字節的ChannelOutboundHandler組成。

Netty附了幾種不同協議的編解碼器,例如HTTP,WebSocket,SSL / TLS等。爲了將這些協議與Netty一起使用,你必須將相應的協議編解碼器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中。

 

原文地址: https://www.zhblog.net/go/java/tutorial/java-netty-channel-pipeline?t=599

 

 

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