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");
        }
}

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