Netty内置处理器整理
Netty提供了很多內置的處理器,高效地利用這些處理器,可以經過簡單的配置就可以實現部分復雜功能,而不是自己花時間和精力去重復造“輪子”。
要使用,得先知道,本文主要依據《netty實戰》一書進行的梳理,結合了實際應用經驗進行了整理。
解碼器
ByteToMessageDecoder:是最基礎的解碼器,將字節數組解析為消息。
?
ReplayingDecoder:繼承自ByteToMessageDecoder,使得我們不必調用readableBytes()方法來判斷是否有足夠的數據可被讀取。
?
LineBasedFrameDecoder:使用了行尾控制字符(\n 或者\r\n)來解析消息數據。
?
MessageToMessageDecoder:將一種消息的格式轉換為另外一種。
?
HttpObjectAggregator:同樣是解碼器的一個子類,非常復雜,處理http請求。
?
注意:由于Netty 是一個異步框架,所以需要在字節可以解碼之前在內存中緩沖它們。因此,不能讓解碼器緩沖大量的數據以至于耗盡可用的內存。為了解除這個常見的顧慮,Netty 提供了TooLongFrameException 類,其將由解碼器在幀超出指定的大小限制時拋出。
?
編碼器
MessageToByteEncoder:最基本的編碼器,將消息編碼為字節數組。
?
MessageToMessageEncoder:將一種消息的格式轉換為另外一種。
?
編解碼器
編解碼器可以在同一個類中管理入站和出站數據和消息的轉換。
?
ByteToMessageCodec:基類,同時實現了ChannelInboundHandler 和ChannelOutboundHandler 接口,但不是直接實現,而是間接實現。
public abstract class ByteToMessageCodec extends ChannelDuplexHandler
public class ChannelDuplexHandler extends ChannelInboundHandlerAdapter implements ChannelOutboundHandler
?
MessageToMessageCodec:消息間的編解碼。
?
從重用的角度來說,將編碼和解碼放到一個類中管理會喪失靈活性,這里有一種途徑來解決該問題,使用CombinedChannelDuplexHandler。這個類充當了ChannelInboundHandler 和ChannelOutboundHandler(該類的類型參數I 和O)的容器。
?
?
安全傳輸
SslHandler:用于加密傳輸。
Http請求
Http編解碼器
HttpServerCodec:服務端,進行http編碼和解碼,實際是HttpRequestDecoder和HttpResponseEncoder兩個的組合。
HttpClientCodec:客戶端,進行http編碼和解碼,實際是HttpRequestEncoder和HttpResponseDecoder兩個的組合。
?
這里用到了我們上章提到的復合編解碼器的CombinedChannelDuplexHandler
public final class HttpClientCodec extends CombinedChannelDuplexHandler<HttpResponseDecoder, HttpRequestEncoder>
implements HttpClientUpgradeHandler.SourceCodec
?
Http聚合器
HttpObjectAggregator:http消息通常是多部分組成,以請求為例,通常由HttpHeader、HttpContent(1個或多個)、LastHttpContent,該處理器可以將tcp多次傳輸的結果組合為一個完整的http請求。
Http壓縮解壓器
壓縮與解壓是為了提高性能。
HttpContentCompressor,放在服務端。
HttpContentDecompressor,放在客戶端。
?
?
WebSocket處理器
WebSocketServerProtocolHandle:負責處理服務端的握手和控制(Ping、Pong、Close),不負責TextWebSocketFrame、BinaryWebSocketFrame和ContinuationWebSocketFrame。
空閑的連接和超時
?
IdleStateHandler:空閑檢測,通常用于心跳保持,可分別設置讀空閑、寫空閑和讀寫都空閑的時間
pipeline.addLast_(new IdleStateHandler(_5,0,0, TimeUnit.SECONDS));
?
如超出后,可觸發空閑事件,由下個處理器在userEventTriggered中處理
public class HeartbeatTimeoutHandler extends ChannelInboundHandlerAdapter {@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if(evt instanceof IdleStateEvent){IdleStateEvent event=(IdleStateEvent)evt;if(event.state().equals(IdleState.READER_IDLE)){log.info("讀空閑");}}else{//非空閑事件,傳遞到下個處理器super.userEventTriggered(ctx,evt);}} }netty不僅內置了靈活性最大的IdleStateHandler,實際還內置了兩個可以直接使用的讀超時和寫超時處理器,對于心跳機制,如果是客戶端發心跳請求,服務端發心跳響應,那么我們完全可以直接使用ReadTimeoutHandler,而不需要使用IdleStateHandler+自定義處理器實現
?
解碼基于分隔符的協議和基于長度的協議
DelimiterBasedFrameDecoder:使用任何由用戶提供的分隔符來提取幀的通用解碼器
LineBasedFrameDecoder:提取由行尾符(\n 或者\r\n)分隔的幀的解碼器。
FixedLengthFrameDecoder:提取在調用構造函數時指定的定長幀
LengthFieldBasedFrameDecoder:根據編碼進幀頭部中的長度值提取幀;該字段的偏移量以及長度在構造函數中指定
?
寫大型數據
如果是直接傳輸文件內容,不做處理,建議使用FileRegion來實現,充分利用零拷貝特性。
如還需要對文件內容處理,則netty內置了ChunkedWriteHandler,不會消耗大量內存,但是需要結合以下類使用

總結
以上是生活随笔為你收集整理的Netty内置处理器整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mapbox简易入门教程
- 下一篇: 值得品读的感悟人生的经典句子 - 格言网