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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
public class MessageDecoderHandler extends ByteToMessageDecoder {
private final ByteBuf header;
private final ByteBuf ender;
public MessageDecoderHandler() {
this.header = Unpooled.buffer();
header.writeByte(0x7E);
this.ender = Unpooled.buffer();
ender.writeByte(0x7E);
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
log.info("收到数据:{}", ByteBufUtil.hexDump(in));
if (ByteBufUtil.hexDump(in).startsWith("7e") && ByteBufUtil.hexDump(in).endsWith("7e")) {
ByteBuf childBuf = decode(in);
if (childBuf != null) {
out.add(childBuf.copy());
log.info("有效数据:{}", ByteBufUtil.hexDump(childBuf));
}
}
}
protected ByteBuf decode(ByteBuf buf) {
int sliceStart = 0;
int sliceEnd = 0;
ByteBuf frame = null;
if (header != null) {
int index = ByteBufUtil.indexOf(header, buf);
if (index > -1 && index < buf.capacity()) {
buf.readerIndex(index + 1);
}
sliceStart = index + 1;
}
if (ender != null) {
int endindex = ByteBufUtil.indexOf(ender, buf);
sliceEnd = endindex;
if (endindex > -1 && endindex > sliceStart && endindex < buf.capacity()) {
assert header != null;
int length = sliceEnd - sliceStart - header.readableBytes();
frame = buf.slice(sliceStart - 2 + header.readableBytes(), length + 3);
buf.skipBytes(sliceEnd - sliceStart + ender.readableBytes());
return frame;
}
}
if (sliceEnd == -1) {
buf.skipBytes(buf.readableBytes());
}
return null;
}
}