package com.github.ltsopensource.nio.codec; import com.github.ltsopensource.nio.channel.NioChannel; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; /** * @author Robert HG (254963746@qq.com) on 2/16/16. */ public abstract class FrameDecoder<T> implements Decoder { private static final int MESSAGE_LENGTH_HEAD = 4; @Override public List<Object> decode(NioChannel channel, ByteBuffer input) throws Exception { List<Object> list = new ArrayList<Object>(); while (input.remaining() > MESSAGE_LENGTH_HEAD) { // 前4位是长度 byte[] lengthBytes = new byte[MESSAGE_LENGTH_HEAD]; input.mark(); //标记当前位置,以便reset input.get(lengthBytes); //读取前4字节 int length = ByteBuffer.wrap(lengthBytes).getInt(); // 数据不够,返回,需要继续读取 if (length == 0 || length > input.remaining()) { input.reset(); return list; } // 够了,开始解码 byte[] bytes = new byte[length]; input.get(bytes, 0, length); T obj = decode(channel, bytes); list.add(obj); } return list; } protected abstract T decode(NioChannel channel, byte[] frame) throws Exception; }