您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Netty分布式固定長度解碼器的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Netty分布式固定長度解碼器的示例分析”這篇文章吧。
我們了解到, 解碼器需要繼承ByteToMessageDecoder, 并重寫decode方法, 將解析出來的對象放入集合中集合, ByteToMessageDecoder中可以將解析出來的對象向下進行傳播, 這一小節帶大家剖析一個最簡單的解碼器FixedLengthFrameDecoder, 從它入手了解碼器的相關原理
FixedLengthFrameDecoder是一個固定長度的解碼器, 功能就是根據固定長度, 截取固定大小的字節數進行解碼
public class FixedLengthFrameDecoder extends ByteToMessageDecoder { //長度大小 private final int frameLength; public FixedLengthFrameDecoder(int frameLength) { if (frameLength <= 0) { throw new IllegalArgumentException( "frameLength must be a positive integer: " + frameLength); } //保存當前frameLength this.frameLength = frameLength; } @Override protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { //通過ByteBuf去解碼.解碼到對象之后添加到out上 Object decoded = decode(ctx, in); if (decoded != null) { //將解析到byteBuf添加到對象里面 out.add(decoded); } } protected Object decode( @SuppressWarnings("UnusedParameters") ChannelHandlerContext ctx, ByteBuf in) throws Exception { //字節是否小于這個固定長度 if (in.readableBytes() < frameLength) { return null; } else { //當前累加器中截取這個長度的數值 return in.readRetainedSlice(frameLength); } } }
我們看到這個類繼承了ByteToMessageDecoder, 重寫了decode方法
這個類只有一個屬性叫frameLength, 并在構造方法中初始化了該屬性
再看decode方法, 在decode方法中又調用了自身另一個重載的decode方法進行解析, 解析出來之后將解析后的數據放在集合out中
重載的decode方法中首先判斷累加器的字節數是否小于固定長度, 如果小于固定長度則返回null, 代表不是一個完整的數據包, 直接返回null
如果大于等于固定長度, 則直接從累加器中截取這個長度的數值
in.readRetainedSlice(frameLength) 會返回一個新的截取后的ByteBuf, 并將原來的累加器讀指針后移frameLength個字節
如果累計器中還有數據, 則會通過ByteToMessageDecoder中callDecode方法里while循環的方式, 繼續進行解碼
這樣, 就是實現了固定長度的解碼工作
以上是“Netty分布式固定長度解碼器的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。