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
消息处理类,用于读取、发送