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
*+-------+---------+-----------+---------+----------+------------+-----------------