美文网首页
Netty源码分析(四) MessageToByteEncode

Netty源码分析(四) MessageToByteEncode

作者: skyguard | 来源:发表于2018-11-07 14:33 被阅读0次

    下面来分析Netty的MessageToByteEncoder,大家都知道,在网络中通信需要将对象序列化成字节数组,发送出去,而到达接收端后就需要把字节数组反序列化成对象,就需要解码。下面就来说说Netty里的编码器MessageToByteEncoder。
    MessageToByteEncoder继承自ChannelOutboundHandlerAdapter,内部有一个类型匹配器TypeParameterMatcher,下面来看一下write方法

    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        ByteBuf buf = null;
        try {
            // 判断是否为匹配的消息
            if (acceptOutboundMessage(msg)) {
                @SuppressWarnings("unchecked")
                I cast = (I) msg;
                // 申请 buf
                buf = allocateBuffer(ctx, cast, preferDirect);
                // 编码
                try {
                    encode(ctx, cast, buf);
                } finally {
                    // 释放 msg
                    ReferenceCountUtil.release(cast);
                }
    
                // buf 可读,说明有编码到数据
                if (buf.isReadable()) {
                    // 写入 buf 到下一个节点
                    ctx.write(buf, promise);
                } else {
                    // 释放 buf
                    buf.release();
                    // 写入 EMPTY_BUFFER 到下一个节点,为了 promise 的回调
                    ctx.write(Unpooled.EMPTY_BUFFER, promise);
                }
    
                // 置空 buf
                buf = null;
            } else {
                // 提交 write 事件给下一个节点
                ctx.write(msg, promise);
            }
        } catch (EncoderException e) {
            throw e;
        } catch (Throwable e) {
            throw new EncoderException(e);
        } finally {
            // 释放 buf
            if (buf != null) {
                buf.release();
            }
        }
    }
    

    其实很简单,就是先申请内存,然后调用encode方法进行编码,调用ChannelHandlerContext的write方法写入ByteBuf中,然后释放ByteBuf,并将事件传递给下一个节点。
    MessageToByteEncoder的分析就到这里了。

    相关文章

      网友评论

          本文标题:Netty源码分析(四) MessageToByteEncode

          本文链接:https://www.haomeiwen.com/subject/gmhvxqtx.html