public class MServerProtocolDecoder extends CumulativeProtocolDecoder {
/**
* Implement this method to consume the specified cumulative buffer and
* decode its content into message(s).
*
* @param in the cumulative buffer
* @return <tt>true</tt> if and only if there's more to decode in the buffer
* and you want to have <tt>doDecode</tt> method invoked again.
* Return <tt>false</tt> if remaining data is not enough to decode,
* then this method will be invoked again when more data is cumulated.
* @throws Exception if cannot decode <tt>in</tt>.
*
*
*/
@Override
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
//now let's decode message to the IoBuffer;
// mark <= position <= limit <= capacity
// if remaining data is not enough to decode (value:MServerConfig.lengthFieldLength);
if (in.remaining()< MServerConfig.lengthFieldLength){
return false;
}
int pack_length=in.getUnsignedShort();//get pack length ,increments the position by two
//the dataLength is not enough to decode
if (in.remaining()<pack_length){
return false;
}
byte[]packMessage=new byte[pack_length];
in.get(packMessage);
//warp byte array to IoBuffer ,add to the messageQueue
out.write(IoBuffer.wrap(packMessage));
out.flush(session.getFilterChain().getNextFilter("MessageCodec"),session);
return true; //decode ok
}
}