MessagePack 编解码

MessagePack 是一个高效的二进制序列化框架, 它像 JSON 一样支持不同语言间的数据交换, 但是它的性能更快, 序列化之后的码流更小.

MessagePack 的特点如下:

  • 编解码高效, 性能高.
  • 序列化之后的码流小.
  • 支持跨语言.

MessagePack 编码器和解码器开发

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>5.0.0.Alpha1</version>
</dependency>

MessagePack 编码器开发

public class MsgpackEncoder extends MessageToMessageEncoder<Object> {
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
        MessagePack msgpack = new MessagePack();
        byte[] bytes = msgpack.write(msg);
        out.add(bytes);
    }
}

负责将 Object 类型的 POJO 对象编码为 byte 数组, 然后添加到集合中.

MessagePack 解码器开发

public class MsgpackDecoder extends MessageToMessageDecoder<ByteBuf> {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        int length = msg.readableBytes();
        byte[] array = new byte[length];

        msg.getBytes(msg.readerIndex(), array, 0 , length);

        MessagePack msgpack = new MessagePack();
        out.add(msgpack.read(array));
    }
}

首先从数据报 msg 中获取需要解码的 byte 数组, 然后调用 MessagePackread 方法将其反序列化为 Objcet 对象, 将解码后的对象加入到 List 集合中. 这样就完成了 MessagePack 的解码操作.

粘包/半包支持

ch.pipeline().addLast("frameDecoder",
                        new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2));

ch.pipeline().addLast("msgpack decoder", new MsgpackDecoder());
ch.pipeline().addLast("frameEncoder", new LengthFieldPrepender(2));
ch.pipeline().addLast("msgpack encoder", new MsgpackEncoder());

利用 LengthFieldBasedFrameDecoderLengthFieldPrepender, 结合新开发的 MessagePack 编解码框架, 实现对 TCP 粘包/半包支持.

MessagePack 编码器之前增加 LengthFieldPrepender, 它将在 ByteBuf 之前增加 2 个字节的消息长度字段.

+----------------+    +--------+----------------+
| "HELLO, WORLD" |--->+ 0x000C | "HELLO, WORLD" |
+----------------+    +--------+----------------+

MessagePack 解码器之前增加 LengthFieldBasedFrameDecoder, 用于处理半包消息, 这样后面的 MsgpackDecoder 接收到的永远是整包消息.

+--------+----------------+    +----------------+
+ 0x000C | "HELLO, WORLD" |--->| "HELLO, WORLD" |
+--------+----------------+    +----------------+
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值