美文网首页
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