Hi
I have an issue with Datagrams and the CumulativeProtocolDecoder
which doesn't seem to cumulate!
(working just fine with TCP).
I have a Decoder extending CumulativeProtocolDecoder.
protected boolean doDecode(IoSession session, ByteBuffer in,
ProtocolDecoderOutput out)
throws Exception
{
int startIndex = in.position(); // Save buffer position
boolean done = doDecodeWithoutBackingUp(session, in, out);
if (!done)
{
// Reset buffer to start as-if doDecodeWithoutBackingUp
had never run
in.position(startIndex);
}
return done;
}
protected boolean doDecodeWithoutBackingUp(IoSession ioSession,
ByteBuffer in, ProtocolDecoderOutput out)
throws Exception
{
if (in.remaining() < TYPE_SIZE)
{
return false; // Need more data, we don't have the type
of the message
}
else
{
type = in.get();
if (type == TYPE_MSG)
{
if (in.remaining() < TRANSACTION_ID_SIZE)
{
return false; // Need more data, we don't have
the transaction id
}
else
{
transactionId = in.getInt();
// do we have the message length?
if (in.remaining() <
CodecUtils.MESSAGE_LENGTH_SIZE)
{
return false; // Need more data, we don't have
the message length
}
else
{
int dataLength = in.getInt(); // Read 4-byte
int data length
// do we have all the data?
if (in.remaining() < dataLength)
{
// Here we're already read 9
bytes (1 byte + 1 int + 1 int) but
==> // we don't have all we need so
we return false and next time
// around we'll have more
return false; // Need more data,
we don't have the complete data
}
else
{
** HERE WE PROCESS A FULL
MESSAGE **
return true; // Please carry on giving
us more data to decode
}
}
}
}
else
{
throw new MySuperDuperException();
}
}
}
The buffer (in.remaining = 30)
I read 9 bytes from the buffer to be able to decide whether to read
more or not.
in.remaining = 20 but my data length is 50 so I need more bytes and
return false.
Another datagram is received in the meantime, I expect the new
datagram to be accumulated behind what I haven't processed
(considering I returned true).
Instead I only get the new datagram and the previous stuff I haven't
processed yet is gone to the big bit bucket in the sky!
Is the Cumulative stuff supposed to work with UDP the same way it
works with TCP? As I wrote at the top it works prefectly with TCP.
Thx.
--
Frederic P. Soulier
OpenPGP key available on http://pgpkeys.mit.edu/
1024D/BA6700ED 49A6 8E8E 4230 8D41 1ADE B649 3203 1DD2 BA67 00ED