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 IoBuffer
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(IoBuffer in) { // Convert the bytes in the specified buffer to a // Command object. ... } protected boolean doDecode(IoSession session, IoBuffer 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; } }
Please note that this decoder simply forward the call to
doDecode(IoSession, IoBuffer, ProtocolDecoderOutput) if the
underlying transport doesn't have a packet fragmentation. Whether the
transport has fragmentation or not is determined by querying
TransportMetadata
.
Modifier | Constructor and Description |
---|---|
protected |
CumulativeProtocolDecoder()
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
void |
decode(IoSession session,
IoBuffer in,
ProtocolDecoderOutput out)
Cumulates content of
in into internal buffer and forwards
decoding request to
doDecode(IoSession, IoBuffer, ProtocolDecoderOutput). |
void |
dispose(IoSession session)
Releases the cumulative buffer used by the specified
session . |
protected abstract boolean |
doDecode(IoSession session,
IoBuffer in,
ProtocolDecoderOutput out)
Implement this method to consume the specified cumulative buffer and
decode its content into message(s).
|
void |
setTransportMetadataFragmentation(boolean transportMetadataFragmentation)
Let the user change the way we handle fragmentation.
|
finishDecode
protected CumulativeProtocolDecoder()
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception
in
into internal buffer and forwards
decoding request to
doDecode(IoSession, IoBuffer, ProtocolDecoderOutput).
doDecode()</tt> is invoked repeatedly until it returns <tt>false
and the cumulative buffer is compacted after decoding ends.session
- The current Sessionin
- the buffer to decodeout
- The ProtocolDecoderOutput
that will receive the decoded messageIllegalStateException
- if your doDecode()</tt> returned <tt>true
not
consuming the cumulative buffer.Exception
- if the read data violated protocol specificationprotected abstract boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception
session
- The current Sessionin
- the cumulative bufferout
- The ProtocolDecoderOutput
that will receive the decoded messagetrue
if and only if there's more to decode in the buffer
and you want to have doDecode
method invoked again.
Return false
if remaining data is not enough to decode,
then this method will be invoked again when more data is
cumulated.Exception
- if cannot decode in
.public void dispose(IoSession session) throws Exception
session
.
Please don't forget to call super.dispose( session )
when you
override this method.dispose
in interface ProtocolDecoder
dispose
in class ProtocolDecoderAdapter
session
- The current SessionException
- if failed to dispose all resourcespublic void setTransportMetadataFragmentation(boolean transportMetadataFragmentation)
false
, the
decode() method will not check the TransportMetadata fragmentation capabilitytransportMetadataFragmentation
- The flag to set.Copyright © 2004–2024 Apache MINA Project. All rights reserved.