Netty解碼器也是非常重要的一個模塊, 服務端接收到客戶端發送過來的消息, 準確說是字節數組, Netty底層已經將它們讀取成ByteBuf了, 但是這些ByteBuf是沒有任何含義的, 就像一些’散兵遊勇’, 我們現在要把它們解碼成我們認識的業務類.
下面的代碼是摘取自RocketMQ源碼
<code>this.serverBootstrap.group(this.eventLoopGroupBoss, this.eventLoopGroupSelector)
.channel(useEpoll() ? EpollServerSocketChannel.class : NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.option(ChannelOption.SO_REUSEADDR, true)
.option(ChannelOption.SO_KEEPALIVE, false)
.childOption(ChannelOption.TCP_NODELAY, true)
.childOption(ChannelOption.SO_SNDBUF, nettyServerConfig.getServerSocketSndBufSize())
.childOption(ChannelOption.SO_RCVBUF, nettyServerConfig.getServerSocketRcvBufSize())
.localAddress(new InetSocketAddress(this.nettyServerConfig.getListenPort()))
.childHandler(new ChannelInitializer<socketchannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(defaultEventExecutorGroup, HANDSHAKE_HANDLER_NAME, handshakeHandler).addLast(defaultEventExecutorGroup, encoder, new NettyDecoder(),
new IdleStateHandler(0, 0, nettyServerConfig.getServerChannelMaxIdleTimeSeconds()),
connectionManageHandler,
serverHandler
);
}
});/<socketchannel>/<code>
大家可以看到一個NettyDecoder類, 它就是一個解碼器.
解碼器一般分為兩類, 一類是消息幀解碼器, 一類是業務解碼器. 消息幀解碼器就是將那些’散兵遊勇’解碼成符合事先約定好的消息格式, 也就是解決消息粘包的問題; 經過消息幀解碼器, 解碼成具有含義的消息幀, 再通過業務解碼器將消息幀解碼成我們認識的業務類.
Netty提供了4個主要的消息幀解碼器 :
FixedLengthFrameDecoder 基於固定長度解碼器
LineBasedFrameDecoder 基於換行符解碼器
DelimiterBasedFrameDecoder 基於分隔符解碼器
LengthFieldBasedFrameDecoder 基於長度解碼器
RocketMQ中的解碼器NettyDecoder也是繼承了LengthFieldBasedFrameDecoder解碼器. 在接下來的文章中我們會詳細說明這些解碼器如何實現解碼.
閱讀更多 書唐瑞 的文章
關鍵字: nettyServerConfig new 解碼