【Netty】編解碼器
當你通過 Netty 傳送或者接受一個訊息的時候,就將會發生一次資料轉換
- 入站時 – 訊息被解碼(Decode):從位元組(二進位制)轉換為我們能讀懂並操作的格式(int、String、Java物件…)
- 出站時 – 訊息被編碼(Encode):從我們能讀懂並操作的格式的形式(int、String、Java物件…)轉換為位元組形式(二進位制)
Netty 提供了一系列實用的編碼解碼器,比如編解碼字串的 StringEncoder 和 StringDecoder,編解碼物件的 ObjectEncoder 和ObjectDecoder 等,他們都實現了 ChannelInboundHadnler 或者 ChannelOutcoundHandler 介面。
在這些類中, channelRead 方法已經被重寫了。以入站為例,對於每個從入站 Channel 讀取的訊息,這個方法會被呼叫。隨後,它將呼叫由已知解碼器所提供的 decode() 方法進行解碼,並將已經解碼的位元組轉發給 ChannelPipeline 中的下一個 ChannelInboundHandler。
除了 Netty 已經實現的,我們也可以通過整合 MessageToByteEncoder,ByteToMessageDecoder 自定義編解碼器。
/*
* 自定義編碼器
* 實現 MessageToByteEncoder介面,重寫 encode 方法
* 注:通過泛型指定可以編碼資料型別
*/
public class LongToByteEncoder extends MessageToByteEncoder<Long> {
@Override
protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {
System.out.println("LongToByteEncoder encode被呼叫");
System.out.println("msg=" + msg);
// 關鍵!!將編碼結果通過 pipeline 繼續向下傳遞,繼續接受處理
out.writeLong(msg);
}
}
/*
* 自定義解碼器
* 實現 ByteToMessageDecoder 介面,重寫 decode 方法
*/
public class ByteToLongDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
System.out.println("ByteToLongDecoder decode 被呼叫");
// 注:因為 long 8個位元組, 需要判斷有8個位元組,才能讀取一個long
if(in.readableBytes() >= 8) {
// 關鍵!!將解碼結果通過 pipeline 繼續向下傳遞,繼續接受處理
out.add(in.readLong());
}
}
}
然後再將我們的自定義編解碼器加入到 ChannelPipeline 中
public class NettyServerInitailizer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) {
ChannelPipeline pipeline = socketChannel.pipeline();
// 入站-Decode
pipeline.addLast(new ByteToLongDecoder());
// 出棧-Encode
pipeline.addLast(new LongToByteEncoder());
// 自定義的 Handler
pipeline.addLast(new NettyServerHandler());
}
}
相關文章
- 什麼是Netty編解碼,Netty編解碼器有哪些?Protostuff怎麼使用?Netty
- netty系列之:netty中常用的物件編碼解碼器Netty物件
- netty系列之:netty中常用的字串編碼解碼器Netty字串編碼
- netty系列之:netty中常用的xml編碼解碼器NettyXML
- netty系列之:netty中的懶人編碼解碼器Netty
- netty系列之:自定義編碼解碼器Netty
- Netty 框架學習 —— 編解碼器框架Netty框架
- Netty原始碼分析之自定義編解碼器Netty原始碼
- Netty原始碼學習6——netty編碼解碼器&粘包半包問題的解決Netty原始碼
- Netty 中的訊息解析和編解碼器Netty
- netty系列之:netty中的核心MessageToMessage編碼器Netty
- netty系列之:netty中的核心MessageToByte編碼器Netty
- 基於Netty實現Redis協議的編碼解碼器NettyRedis協議
- Netty 框架學習 —— 預置的 ChannelHandler 和編解碼器Netty框架
- Netty常用招式——ChannelHandler與編解碼Netty
- netty系列之:netty中的frame解碼器Netty
- netty系列之:netty中的核心編碼器bytes陣列Netty陣列
- netty系列之:netty中的核心編碼器base64Netty
- Netty-解碼器架構與常用解碼器Netty架構
- netty系列之:netty中的核心解碼器jsonNettyJSON
- Netty入門系列(3) --使用Netty進行編解碼的操作Netty
- netty系列之:netty中的自動解碼器ReplayingDecoderNetty
- 還有這種好事!netty自帶http2的編碼解碼器framecodecNettyHTTP
- netty系列之:java中的base64編碼器NettyJava
- Netty原始碼深度解析(九)-編碼Netty原始碼
- netty系列之:自定義編碼和解碼器要注意的問題Netty
- 編解碼器軟體支援 WMP,因為它使用 Directshow 編解碼器
- Netty3:分隔符和定長解碼器Netty
- Netty之資料解碼Netty
- Netty編碼流程及WriteAndFlush()的實現Netty
- 【JAVA 網路程式設計系列】Netty -- 基本編解碼方式的支援Java程式設計Netty
- 編寫 Netty / RPC 客戶端【框架程式碼分析】NettyRPC客戶端框架
- Netty非同步Future原始碼解讀Netty非同步原始碼
- 快速瞭解 變分自編碼器 VAE
- 用 JavaScript 編寫 MPEG1 解碼器JavaScript
- Unicode編碼解碼Unicode
- Netty-新連線接入原始碼解讀Netty原始碼
- Javascript編碼解碼URLJavaScript