netty(三)LengthFieldBasedFrameDecoder解码器的使用例子

1.需求 :发送数据接收数据个格式

/**
     *         发送数据格式                                         接收数据的格式
     * +---2----+--2--+---4--+--4--+----512---+---512-----+-----+-------+-------+-------+---------+
     *  type1  type2    len1   len2  data1[]   data2[] |  type1  type2 len1 len2  data1[]  data2[]
     *  short  short    int    int   byte[]    byte[]  |   type1  type2 len1 len2 data1    data2
     *+-------+---------+-----------+---------+----------+------------+-------------------------+
     */

由于这个·数据解析格式跟官方给出的都不一样,所以只能查看LengthFieldBasedFrameDecoder源码来看看到底应该解析这个数据

最后构造器中几个参数取值如下:

  • lengthFieldOffset=8:开始的4个字节是meta,然后才是长度域为4个字节,所以长度域偏移为8。
  • lengthFieldLength=4:长度域4个字节。
  • lengthAdjustment=0:长度域指定的长度位数据长度,所以数据长度不需要修正。
  • initialBytesToStrip=0:发送和接收数据相同,不需要跳过数据

重新继承LengthFieldBasedFrameDecoder的解码器代码如下:

import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import java.nio.ByteOrder;

public class CustomizeDecoder extends LengthFieldBasedFrameDecoder {

    public CustomizeDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength,
                            int lengthAdjustment, int initialBytesToStrip, boolean failFast) {
        super(maxFrameLength, lengthFieldOffset, lengthFieldLength,
                lengthAdjustment, initialBytesToStrip, failFast);
    }

    @Override
    protected long getUnadjustedFrameLength(ByteBuf buf, int offset, int length, ByteOrder order) {
        buf = buf.order(order);
        long frameLength;
        frameLength = buf.getUnsignedInt(offset) + buf.getUnsignedInt(offset + 4);
        return frameLength;
    }

    /**
     *         发送数据格式                                         接收数据的格式
     * +---2----+--2--+---4--+--4--+----512---+---512-----+-----+-------+-------+-------+---------+
     *  type1  type2    len1   len2  data1[]   data2[] |  type1  type2 len1 len2  data1[]  data2[]
     *  short  short    int    int   byte[]    byte[]  |   type1  type2 len1 len2 data1    data2
     *+-------+---------+-----------+---------+----------+------------+-----------------
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值