Hi, Thank you for your kind.
What's the diff. between these two methods?
In IoBuffer's src. code, it seems to only use ByteBuffer whose get(byte[]
dst) only return get(dst, 0, dst.length).

2009/4/6 Maarten Bosteels <[email protected]>

> By the way,  you can do
>      in.get(data);
> instead of
>      in.get(data,0,FRAME_LENGTH);
>
> Maarten
>
> On Mon, Apr 6, 2009 at 11:27 AM, Maarten Bosteels
> <[email protected]> wrote:
> > Hi,
> >
> > I would remove the loop from your implementation. Mina laready does
> > this loop for you:
> >
> > protected boolean doDecode(IoSession session, IoBuffer in,
> > ProtocolDecoderOutput out) throws Exception {
> >  int remain = in.remaining();
> >  if (remain >= FRAME_LENGTH){
> >   byte [] data = new byte [FRAME_LENGTH];
> >   in.get(data,0,FRAME_LENGTH);
> >   out.write(data);
> >   out.flush();
> >   System.out.println("remain data:"+remain);
> >   return true;
> >  }
> >  return false;
> > }
> >
> > I don't think you need the flush in this case.
> >
> > regards,
> > Maarten
> >
> > On Mon, Apr 6, 2009 at 10:32 AM, Ashish <[email protected]> wrote:
> >>>
> >>> The message format is the fixed-length message which is defined by
> >>> FRAME_LENGTH.
> >>> The following is my doDecode method:
> >>>
> >>> protected boolean doDecode(IoSession session, IoBuffer in,
> >>> ProtocolDecoderOutput out) throws Exception {
> >>>  int remain = in.remaining();
> >>>  if (remain >= FRAME_LENGTH){
> >>>    byte [] data = new byte [FRAME_LENGTH];
> >>>    while (remain >= FRAME_LENGTH){
> >>>          in.get(data,0,FRAME_LENGTH);
> >>>          out.write(data);
> >>>          out.flush();
> >>>          System.out.println("remain data:"+remain);
> >>>          remain = in.remaining();
> >>>    }
> >>>    return false;
> >>>  }
> >>>  return false;
> >>> }
> >>> The server keep sending message to my client and I decode the message
> in
> >>> this doDecode.
> >>> In my test, the "remain data" in the console seemed to be keep going up
> util
> >>> got the java heap space outofmemoryError.
> >>> Three notes:
> >>> 1> Why I always use return false: I don't understand the diff between
> true
> >>> or false. At first, I thought the when I got the enough data to put
> into the
> >>> out, I should use return true. But I got error. So I alway use false
> and
> >>> currently, the logic seems correct.
> >>
> >> Use true, when you have received all the data necessary to decode. And
> >> once you have complete data, then only you write to protocol decoder
> >> output.
> >>
> >> Simple pseduo code
> >> 1. check if the incoming data equals to data needed
> >> 2. No return false, reset the position to beginning
> >> 3. keep in this loop till, you have all the data
> >> 4. All the data received, write to decoder output and return true
> >>
> >>
> >> Check out this page on wiki
> >>
> >> http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html
> >>
> >>> 2> Why I use out.flush. I found if I don't do that, the messageReceived
> >>> method couldn't get correct every message. Some message will lost and
> others
> >>> may be duplicated.
> >>
> >> Not sure on this. Sorry
> >>
> >>> 3> The data transfer speed is about 1MB/s.
> >>>
> >>> Any friends help me?
> >>> Thank you in advance!
> >>>
> >>> --
> >>> Best Regards
> >>> DAI Jun
> >>>
> >>
> >>
> >>
> >> --
> >> thanks
> >> ashish
> >>
> >> Blog: http://www.ashishpaliwal.com/blog
> >> My Photo Galleries: http://www.pbase.com/ashishpaliwal
> >>
> >
>



-- 
Best Regards
DAI Jun

Reply via email to