Netty使用MessagePack做编解码

https://baijiahao.baidu.com/s?id=1649056941212251589&wfr=spider&for=pc

另外在编解码中使用消息头中定长类

channel.pipeline().addLast("frameDecoder", new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2));
channel.pipeline().addLast("msgpack decoder", new MsgpackDecoder());
channel.pipeline().addLast("frameEncoder", new LengthFieldPrepender(2));
channel.pipeline().addLast("msgpack encoder", new MsgpackEncoder()); channel.pipeline().addLast(new EchoClientChannelHandler());
第一个类:LengthFieldBasedFrameDecoder

用于TCP拆包与粘包的解码支持

参数(1)maxFrameLength:表示的是包的最大长度,超出会做一些特殊处理。

参数(2)lengthFieldOffset:指定长度域的偏移量,表示跳过指定长度个字节才是长度域;

参数(3)lengthFieldLength:本数据帧的长度;

参数(4)lengthAdjustment:该字段加长度字段等于数据帧的长度,包体长度调整的大小。

参数(5)initialBytesToStrip:获取完一个完整的数据包之后,忽略前面的指定的位数

在(3)中这里我们指定了消息长度为2个字节,最大可以支持 2^16-1 = 65535个正整数,所以我们同时在LengthFieldBasedFrameDecoder的第一个参数中也指定了最大长队为65535

第二个类:MsgpackDecoder

利用MessagePack做解码(反序列化)

第三个类:LengthFieldPrepender

指定编码时,在消息头前加两个字节,用于TCP粘包与拆包的编码支持

第四个类:MsgpackEncoder

利用MessagePack做编码(序列化)

第五个类:EchoClientChannelHandler

消息处理类,用于读取、发送

你可能感兴趣的:(netty)