Change what I gave you to conform with MINA.  I simply wrote everything in
notepad to give you an idea.


On Tue, Sep 3, 2013 at 1:31 AM, Luciano Coelho <luci...@lvcsistemas.com>wrote:

> Thanks a lot for you answer, I will study about filters and try your
> solution too.
>
> Thanks too much really.
>
> -----Mensagem original-----
> De: Jon V. [mailto:sybersn...@gmail.com]
> Enviada em: segunda-feira, 2 de setembro de 2013 23:54
> Para: users@mina.apache.org
> Assunto: Re: Send/Receive IoBuffer
>
> This is better:  I am not going to use the correct API but you can get the
> idea.
>
> Create a Filter called CompoundBufferFilter
>
> filter_received( ByteBuffer source, IoSession session, Filter next ) {
> ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME );
>
>  if( buffering == null )
>  {
> buffering = ByteBuffer.allocate( some size );  }
>
>  buffering.put( source );
>  buffering.flip();
>
>  next.received( buffering, session );
> }
>
> This will compound buffer incoming data.
>
> logic_received( ByteBuffer source, IoSession session ) { while(
> source.hasRemaining() ) { source.mark(); if( source.remaining < 4 ) {
>                         source.reset();
> return;
> }
>  int size = source.getInt();
>  if( source.remaining < size )
> {
> source.reset();
> return;
> }
>  String data = new String( buffering.array, buffering.offset, size,
> "ISO-8859-1"); }  source.compact(); }
>
> Now you can simply "return" if you don't have enough data.
>
>
>
> On Mon, Sep 2, 2013 at 10:42 PM, Jon V. <sybersn...@gmail.com> wrote:
>
> >
> >
> >
> > On Mon, Sep 2, 2013 at 10:21 PM, Luciano Coelho
> <luci...@lvcsistemas.com>wrote:
> >
> >> Yeah Jon, you're right about flush, the wrong thing is really the
> >> IoBuffer.
> >> I put the: session.getConfig().setReadBufferSize(16*1024), on
> >> connector as you told me.
> >>
> >> I changed now for what you answered me, like this:
> >>
> >> if(size > 0){
> >>         while (buffer.hasRemaining()){
> >>                 byte[] payload = new byte[size];
> >>               buffer.get(payload);
> >>               data = new String( payload, "ISO-8859-1");
> >>         }
> >> }
> >>
> >
> > Ok - Mina does not allow for compound rx_buffers.  This means you are
> > going to have to manually buffer the message yourself.
> >
> >
> > received( ByteBuffer source, IoSession session ) { while(
> > source.hasRemaining() ) {  ByteBuffer buffering =
> > session.getAttribute( SOME_PROPERTY_BUFFER_NAME );
> >
> > if( buffering != null )
> > {
> >    // must be a new data
> >    int size = // read size somehow
> >    buffering = ByteBuffer.allocate( size );
> >
> >    buffering.put(source);
> >
> >    if( buffering.hasRemaining() )
> >    {
> > session.setAttribute( SOME_PROPERTY_BUFFER_NAME, buffering );  return;
> >    }
> >    else
> >    {
> >  // message is complete
> > session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new
> > String( buffering.array, buffering.offset, buffering.limit,
> > "ISO-8859-1");
> >    }
> > }
> > else
> > {
> >  buffering.put(source);
> >  if( !buffering.hasRemaining() )
> >  {
> > // message is complete
> > session.clearAttribute( SOME_PROPERTY_BUFFER_NAME );  String data =
> > new String( buffering.array, buffering.offset, buffering.limit,
> > "ISO-8859-1"); }  else { return; }  } } }
> >
> > In MINA you have to read everything out of that ByteBuffer or it will
> > be lost forever.  This means you could get stuck only having 2 bytes
> > in the buffer and not enough to read the size value.  So you may have
> > to setup a secondary buffer to store partial size values if that scenario
> does occur.
> >
> >
> >>
> >> I'm receiving from de server 2685 bytes and I set the buffer to
> >> 64*1024, and I'm still having the error: D/WEB(26934):
> >> java.nio.BufferUnderflowException.
> >>
> >> I saw that setting tcpnodelay = false becomes better, I got make 3
> >> requests without error, but after the error happens again, and I have
> >> to restart the session again.
> >> Do I have to finish something in the IoBuffer after receive the data?
> >> Note that I'm not opening another session, I open one time and stay
> >> changing data all the time. The rest is functioning very well, one by
> >> one minute I send something and the server answer quickly, the only
> >> problem now is this big request that one time goes another time not.
> >>
> >> Thank's again.
> >>
> >> LUCIANO
> >>
> >> -----Mensagem original-----
> >> De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2
> >> de setembro de 2013 19:26
> >> Para: users@mina.apache.org
> >> Assunto: Re: Send/Receive IoBuffer
> >>
> >> On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho
> >> <luci...@lvcsistemas.com>wrote:
> >>
> >> > Hello everybody.
> >> >
> >> >
> >> >
> >> > I'm learning how to use Mina and my questions are:
> >> >
> >> >
> >> >
> >> > I solved my problem of having a answer from my server without
> >> > closing the session like this:
> >> >
> >> >
> >> >
> >> > System.out.flush();
> >> >
> >>
> >>
> >> This really gives me an indication of your Java knowledge.
> >> System.out is your access to stdout in Java.  It is what you use to
> >> print things to the console.  It has nothing to do with your
> application.
> >>
> >> Maybe posting on StackOverflow would be a good idea for general java
> help?
> >>
> >>
> >> >
> >> >
> >> >
> >> > Is that ok?
> >> >
> >> >
> >> >
> >> > I'm receiving the answer in Android via GPRS like this:
> >> >
> >> >
> >> >
> >> > First I set this on sessionCreated
> >> >
> >> > session.getConfig().setReadBufferSize(16*1024);
> >> >
> >> >
> >> >
> >> You should set this in Mina config.  It is not good to change on the
> >> fly like this.
> >>
> >> Read the Quick Start Guide:
> >> http://mina.apache.org/mina-project/quick-start-guide.html
> >>
> >>
> >> >
> >> > @Override public void messageReceived(IoSession session, Object
> >> > message) throws Exception {
> >> >
> >> >                 IoBuffer                              buffer
> >> > = (IoBuffer)                       message;
> >> >
> >> >                 int                                          service
> >> > = (Integer)                         session.getAttribute("SERVICE");
> >> >
> >> >                 Listener                               listener
> >> > = (Listener)                        session.getAttribute("LISTENER");
> >> >
> >> >                 String                                   data
> >> > = "";
> >> >
> >> >                 int                                          size
> >> > = buffer.getInt();
> >> >
> >> >                 while (buffer.hasRemaining()){
> >> >
> >> >                                data += (char) buffer.get();
> >> >
> >>
> >> Using the += is the worst possible way to build a String.
> >>
> >> Since you are reading a String.  Are you sure that the String is
> >> encoded using 8 bits?
> >>
> >> byte[] payload = new byte[size];
> >> buffer.get(payload);
> >>
> >> String data = new String( payload, "UTF-8");
> >>
> >>
> >>
> >> >
> >> >                 }
> >> >
> >> >                 if(size == data.trim().length()){
> >> >
> >>
> >> Why are you trying to trim the string?  Are you expecting whitespaces?
> >>
> >>
> >> >
> >> >                                if(listener != null)
> >> > listener.requisitionFinished(data, service);
> >> >
> >> >                 } else {
> >> >
> >> >                                if(listener != null)
> >> > listener.requisitionFinished("", service);
> >> >
> >> >                 }
> >> >
> >> >                 Log.d("WEB", "SERVICE: " + service + " SIZE: " +
> >> > size +
> >> "
> >> > DATA: " + data);
> >> >
> >> > }
> >> >
> >> >
> >> >
> >> > Sometimes I receive the data in parts, when the message arriving is
> >> > too long and it causes an error, even if the buffersize is bigger
> >> > than the data I'm receiving.
> >> >
> >> >
> >> >
> >> > Thank's a lot.
> >> >
> >> >
> >> >
> >> > Luciano Coelho
> >> >
> >> >
> >>
> >>
> >
>
>

Reply via email to