Hello.

I'm worried for 3, 4 days. but I cannot solve this problem.

my packet structure is below.

start byte - 1byte
client ID - 2 byte
command - 1 byte
data size - 4 byte
reserved - 1 byte
reserved - 1 byte
-------------------------------------- upside is header, base is data
data - variable byte (this size depend on 'data size' in header)

how can I assemble splitted packet?


On 10/15/07, Maarten Bosteels <[EMAIL PROTECTED]> wrote:
> You could also have a look at the tutorial:
> http://mina.apache.org/tutorial-on-protocolcodecfilter.html
>
> The example in the tutorial also works with a data_length header
> so it should be similar to your protocol.
>
> Maarten
>
> On 10/15/07, Niklas Therning <[EMAIL PROTECTED]> wrote:
> > Ok, then the isCompletePacket() could look something like:
> >
> > private boolean isCompletePacket(ByteBuffer in) {
> >   // Assuming header is always 4 bytes and the data_length value
> > occupies 2 bytes
> >   if (in.remaining() < 1 + 4 + 2) {
> >     // Too few bytes in buffer.
> >     return false;
> >   }
> >   in.get(); // Skip start byte (1 byte)
> >   in.getInt(); // Skip header (4 bytes)
> >   short data_length = in.getShort(); // Get data_length field (2 bytes)
> >   // in's position is now directly after the data_length field
> >   return in.remaining() >= data_length;
> > }
> >
> > So what we're doing here is first checking if enough bytes have been
> > received to be able to read the data_length field. Then we check if
> > there are at least data_length bytes in the buffer after the data_length
> > field.
> >
> > HTH
> > /Niklas
> >
> > Sungwon Jung wrote:
> > > Thank you Niklas Therning.
> > >
> > > packet structure is start_byte + header + data_length + data.
> > > so I have no end byte. just data_length.
> > >
> > >
> > > On 10/15/07, Niklas Therning <[EMAIL PROTECTED]> wrote:
> > >
> > >> If I understand your code correctly you look for the start of a new
> > >> packet. Shouldn't you check for the packet end instead? Just because you
> > >> see the start of a new packet it doesn't necessarily mean the in
> > >> variable contains a complete packet.
> > >>
> > >> The CumulativeProtocolDecoder will remember the received bytes until
> > >> your doDecode() method returns true. Your code should look something 
> > >> like:
> > >>
> > >> if (isCompletePacket(in)) {
> > >>   // Create the MessageReq object from the bytes and call out.write()
> > >> } else {
> > >>     // No complete packet in in. Wait for more data by returning false.
> > >>     return false;
> > >> }
> > >>
> > >> Do you have some means of determining if a complete packet is in the in
> > >> variable?
> > >>
> > >> HTH
> > >>
> > >> /Niklas
> > >>
> > >> Sungwon Jung wrote:
> > >>
> > >>> sorry.
> > >>>
> > >>> I received large packet, prints "RAW DATA" twice.
> > >>> first, print RAW DATA include packet header.
> > >>> second, print RAW DATA (just data).
> > >>>
> > >>> sorry, English is poor.
> > >>>
> > >>> <all code>
> > >>> public class PacketReqAnalysis extends CumulativeProtocolDecoder
> > >>> {
> > >>>       protected boolean doDecode(IoSession session, ByteBuffer in,
> > >>> ProtocolDecoderOutput out) throws Exception {
> > >>>               logger.debug( "RAW DATA - " + in.getHexDump() );
> > >>>               int start = in.get() & 0xFF;
> > >>>
> > >>>               if( start == PacketDefine.START ) {
> > >>>                       ByteBuffer pk = ByteBuffer.allocate( 2, false );
> > >>>                       pk.setAutoExpand( true );
> > >>>
> > >>>                       pk.put( (byte)start );
> > >>>                       pk.putShort( (short)(in.getShort() & 0xFFFF) );
> > >>>                       pk.put( (byte)in.get() );
> > >>>                       pk.put( (byte)in.get() );
> > >>>                       int size = in.getInt();
> > >>>                       pk.putInt( size );
> > >>>                       pk.put( (byte)in.get() );
> > >>>                       pk.put( (byte)in.get() );
> > >>>
> > >>>                       byte[] bytes = new byte[ size ];
> > >>>                        in.get( bytes );
> > >>>                       pk.put( bytes );
> > >>>
> > >>>                       MessageReq request = new MessageReq( session, pk, 
> > >>> out, start );
> > >>>                       out.write( acu_request );
> > >>>
> > >>>                       return true;
> > >>>               } else {
> > >>>                       logger.debug( "out doDecode-------------------" );
> > >>>                       logger.debug( "buf is " + in.getHexDump() );
> > >>>                       logger.debug( "out doDecode-------------------" );
> > >>>                       return false;
> > >>>               }
> > >>>       }
> > >>> }
> > >>>
> > >>>
> > >>> On 10/15/07, Niklas Therning <[EMAIL PROTECTED]> wrote:
> > >>>
> > >>>
> > >>>> Sungwon Jung wrote:
> > >>>>
> > >>>>
> > >>>>> Hello. I'm using MINA 1.1.2.
> > >>>>>
> > >>>>> I'm using CumulativeProtocolDecoder.
> > >>>>> When I recieved large size packet(about 220bytes), the packet is 
> > >>>>> splited.
> > >>>>> How can I assemble the splited packet?
> > >>>>>
> > >>>>> Thank you.
> > >>>>>
> > >>>>>
> > >>>>> my code>
> > >>>>> public class PacketReqAnalysis extends CumulativeProtocolDecoder
> > >>>>> {
> > >>>>>
> > >>>>>       protected boolean doDecode(IoSession session, ByteBuffer in,
> > >>>>> ProtocolDecoderOutput out) throws Exception {
> > >>>>>
> > >>>>>               if( start == PacketDefine.START ) {
> > >>>>>                               return true;
> > >>>>>               } else {
> > >>>>>                       return false;
> > >>>>>               }
> > >>>>>       }
> > >>>>> }
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>> Your code looks weird. Is this really all code? Where does the start
> > >>>> variable come from?
> > >>>>
> > >>>> /Niklas

Reply via email to