You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

75 lines
2.8 KiB

package com.inspect.tcpserver.tcp;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.tomcat.util.buf.HexUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class MyDecoder extends ByteToMessageDecoder {
private static final Logger log = LoggerFactory.getLogger(MyDecoder.class);
private final String PACKET_FLAG = "EB90";
private final int BASE_LENGTH = 2 + 8 + 8 + 1 + 4 + 2;
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
if (in.readableBytes() >= BASE_LENGTH) {
try {
//skip
if (in.readableBytes() > 512 * 1024) {
in.skipBytes(in.readableBytes());
}
final String uuid = RandomStringUtils.randomAlphanumeric(32);
ByteBuf forPrint = in.copy();
log.info("################ 会话: {}, 客户: {}, 上行原始报文 ################ \n {}", uuid, ctx.channel().id().asShortText(), ByteBufUtil.hexDump(forPrint));
int index;
String flag;
while (true) {
index = in.readerIndex();
in.markReaderIndex();
byte[] dst = new byte[2];
in.readBytes(dst, 0, 2);
flag = ByteUtils.byte2Hex(dst);
if (PACKET_FLAG.equalsIgnoreCase(flag)) {
break;
}
in.resetReaderIndex();
if (in.readableBytes() < BASE_LENGTH) {
return;
}
}
long sendIndex = in.readLongLE();
long receiveIndex = in.readLongLE();
byte sourceFlag = in.readByte();
int xmlLength = in.readIntLE();
if (in.readableBytes() < xmlLength) {
in.readerIndex(index);
return;
}
byte[] payload = new byte[xmlLength];
in.readBytes(payload);
in.readShortLE();
BinaryModel binaryModel = new BinaryModel();
binaryModel.receiveIndex = receiveIndex;
binaryModel.sendIndex = sendIndex;
binaryModel.sourceFlag = sourceFlag;
binaryModel.dataLength = xmlLength;
binaryModel.dataBuf = Unpooled.copiedBuffer(payload);
binaryModel.uuid = uuid;
out.add(binaryModel);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}