public abstract class CumulativeProtocolDecoder extends ProtocolDecoderAdapter
ProtocolDecoder
that cumulates the content of received
buffers to a cumulative buffer to help users implement decoders.
If the received ByteBuffer
is only a part of a message.
decoders should cumulate received buffers to make a message complete or
to postpone decoding until more buffers arrive.
Here is an example decoder that decodes CRLF terminated lines into
Command
objects:
public class CRLFTerminatedCommandLineDecoder extends CumulativeProtocolDecoder { private Command parseCommand(ByteBuffer in) { // Convert the bytes in the specified buffer to a // Command object. ... } protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws Exception { // Remember the initial position. int start = in.position(); // Now find the first CRLF in the buffer. byte previous = 0; while (in.hasRemaining()) { byte current = in.get(); if (previous == '\r' && current == '\n') { // Remember the current position and limit. int position = in.position(); int limit = in.limit(); try { in.position(start); in.limit(position); // The bytes between in.position() and in.limit() // now contain a full CRLF terminated line. out.write(parseCommand(in.slice())); } finally { // Set the position to point right after the // detected line and set the limit to the old // one. in.position(position); in.limit(limit); } // Decoded one line; CumulativeProtocolDecoder will // call me again until I return false. So just // return true until there are no more lines in the // buffer. return true; } previous = current; } // Could not find CRLF in the buffer. Reset the initial // position to the one we recorded above. in.position(start); return false; } }
Modifier | Constructor and Description |
---|---|
protected |
CumulativeProtocolDecoder()
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
void |
decode(IoSession session,
ByteBuffer in,
ProtocolDecoderOutput out)
Cumulates content of in into internal buffer and forwards
decoding request to
doDecode(IoSession, ByteBuffer, ProtocolDecoderOutput) . |
void |
dispose(IoSession session)
Releases the cumulative buffer used by the specified session.
|
protected abstract boolean |
doDecode(IoSession session,
ByteBuffer in,
ProtocolDecoderOutput out)
Implement this method to consume the specified cumulative buffer and
decode its content into message(s).
|
finishDecode
protected CumulativeProtocolDecoder()
public void decode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws java.lang.Exception
doDecode(IoSession, ByteBuffer, ProtocolDecoderOutput)
.
doDecode() is invoked repeatedly until it returns false
and the cumulative buffer is compacted after decoding ends.java.lang.IllegalStateException
- if your doDecode() returned
true not consuming the cumulative buffer.java.lang.Exception
- if the read data violated protocol specificationprotected abstract boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws java.lang.Exception
in
- the cumulative bufferjava.lang.Exception
- if cannot decode in.public void dispose(IoSession session) throws java.lang.Exception
dispose
in interface ProtocolDecoder
dispose
in class ProtocolDecoderAdapter
java.lang.Exception
- if failed to dispose all resourcesCopyright © 2004-2019 Apache MINA Project. All Rights Reserved.