package rpc; import com.jsowell.common.util.bean.SerializationUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import java.util.List; public class MessageDecode extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { // 由于数据包的前4个字节用于记录总数据大小,如果数据不够4个字节,不进行读 if(byteBuf.readableBytes() < 4) { return; } // 标记开始读的位置 byteBuf.markReaderIndex(); // 前四个字节记录了数据大小 int dataSize = byteBuf.readInt(); // 查看剩余可读字节是否足够,如果不是,重置读取位置,等待下一次解析 if(byteBuf.readableBytes() < dataSize) { byteBuf.resetReaderIndex(); return; } // 读取消息类型 byte messageType = byteBuf.readByte(); // 读取数据, 数组大小需要剔除1个字节的消息类型 byte[] data = new byte[dataSize -1]; byteBuf.readBytes(data); Message message = SerializationUtil.deserialize(MessageConstant.getMessageClass(messageType), data); list.add(message); } }