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 > >> > > >> > > >> > >> > > > >