【第22篇】Netty解碼器剖析與入站出站處理器

Netty的處理器重要概念

  • 1、Netty的處理器可以分為兩大類:入站處理器與出站處理器
  • 2、入站處理器的頂層是ChannelInboundHandler,而出站處理器的頂層是ChannelOutboundHandler
  • 3、數(shù)據(jù)處理器時常用的各種編解碼,本質(zhì)上都是處理器
  • 4、編解碼器:物流我們向網(wǎng)絡(luò)希爾的數(shù)據(jù)是什么類型(int,char,String 二進制等)數(shù)據(jù)在網(wǎng)絡(luò)傳遞時候,其都是以字節(jié)流的形式呈現(xiàn)的,將數(shù)據(jù)由原本的形式轉(zhuǎn)換為字節(jié)流的操作成為編碼encode,將數(shù)據(jù)由字節(jié)流轉(zhuǎn)換成原本的格式或是其他格式的操作稱為解碼(decode),編解碼統(tǒng)稱為codec
  • 5、編碼:本質(zhì)上是一種出站的處理器,因此一定是ChannelOutboundHandler
  • 6、解碼:本質(zhì)上是一種入站的處理器,因此一定是ChannelInboundHandler
  • 7、在Netty中,編碼器通常以XXXEncoder命名,解碼器通常以XXXDecoder命名
    *入站處理器代碼使用如:
public class MyServerHandler extends SimpleChannelInboundHandler<String> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println(ctx.channel().remoteAddress() + ", " + msg);
        ctx.channel().writeAndFlush("from server: " + UUID.randomUUID());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
SimpleChannelInboundHandler
ChannelInboundHandler
ChannelOutboundHandler

關(guān)于Netty編解碼的重要結(jié)論

  • 1、無論是編碼器還是解碼器,其所接收的消息類型,必須要與待處理的參數(shù)類型一致,否則該編碼器或解碼器并不會被執(zhí)行
  • 2、在解碼器進行數(shù)據(jù)解碼時候,一定要記得判斷(ByteBuf)中的數(shù)據(jù)是否足夠,否則將會產(chǎn)生一些問題

組合方式管理通道句柄

  • CombinedChannelDuplexHandler,從代碼里面看出來,它基礎(chǔ)ChannelDuplexHandler管道,此類有諸多重要的方法如:bind,channelRead,
    connectdisconnectderegister,而它有一個內(nèi)部類DelegatingChannelHandlerContext,它也有比較多重要的方法,如:alloc,attr,bind這里不寫了,請看【DelegatingChannelHandlerContext方法】截圖
CombinedChannelDuplexHandler關(guān)系圖

DelegatingChannelHandlerContext方法

DelegatingChannelHandlerContext方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容