下面来分析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的分析就到这里了。
网友评论