日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Netty内置处理器整理

發布時間:2024/3/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的容器。
?

public class CombinedByteCharCodec extends CombinedChannelDuplexHandler<ByteToCharDecoder, CharToByteEncoder> { public CombinedByteCharCodec() { super(new ByteToCharDecoder(), new CharToByteEncoder()); } }

?

安全傳輸

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,不會消耗大量內存,但是需要結合以下類使用
![image.png](https://img-blog.csdnimg.cn/img_convert/98a0d29e772dd53fc4697f9b8c321af6.png#clientId=u528a172e-1fa9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=216&id=uec0ebae6&margin=[object Object]&name=image.png&originHeight=238&originWidth=1068&originalType=binary&ratio=1&rotation=0&showTitle=false&size=66486&status=done&style=none&taskId=u27e0de38-3722-4fd5-8104-cca6d0a8243&title=&width=970.9090698652036)

總結

以上是生活随笔為你收集整理的Netty内置处理器整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。