netty tcp拆包

时间:2023-03-09 05:18:42
netty tcp拆包
private List<byte[]> getCompletePacket(byte[] bytes, ByteBuf byteBuf) {
byte[] clone = bytes.clone();
int i = 0;
List<byte[]> ret = Lists.newArrayList();
while (i + YTLConstant.HEADER_LENGTH < clone.length) {
byte[] header = Arrays.copyOfRange(clone, i, YTLConstant.HEADER_LENGTH);
if (Arrays.equals(header, YTLConstant.ELECTRICITY_METER_RECEIVE_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_SETTING_RECEIVE_NORMAL_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_SETTING_RECEIVE_WRONG_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_STATUS_RECEIVE_HEADER)) {
//读取电表 接收数据 头
if (YTLConstant.HEADER_LENGTH + 1 < clone.length) {//加1为了判断长度位
byte infoLength = clone[YTLConstant.HEADER_LENGTH];
int tailIndex = YTLConstant.HEADER_LENGTH + infoLength + 2;//CRC长度为2
if (tailIndex <= clone.length - 1 && bytes[tailIndex] == YTLConstant.TAIL) {
i = tailIndex + 1;
if (i == clone.length) {
ret.add(bytes);
byteBuf.skipBytes(i);
} else {
ret.add(Arrays.copyOf(clone, i));//从clone中截取长度为i的数组
clone = Arrays.copyOfRange(clone, i, clone.length - 1);
byteBuf.skipBytes(i);
i = 0;
}
}else{
//无效指令跳过
byteBuf.skipBytes(clone.length);
break;
}
}
}else{
//无效指令跳过
if (logger.isDebugEnabled()) {
logger.debug("Received an unregistered cmd,the header is : "+Arrays.toString(header));
}
byteBuf.skipBytes(clone.length);
break;
}
}
return ret;
}