Let me understand, it seems to be easy, but it's not anymore: How can I change the signature of messageReceived(IoSession session, Object message) for messageReceived( ByteBuffer source, IoSession session ) and make the handler response to that?
while( source.hasRemaining() ) { ByteBuffer buffering = session.getAttribute("BUFFER_NAME"); //here it's ok I create a bytebuffer on the request with the size I need and pass to it by attribute; if( buffering != null ) { //if I'm passing that by attribute it will always be null // must be a new data int size = source.getInt(); buffering = ByteBuffer.allocate( size ); buffering.put(source); if( buffering.hasRemaining() ) { session.setAttribute("BUFFER_NAME", buffering ); return; } else { // message is complete session.removeAttribute("BUFFER_NAME"); String data = new String( buffering.array(), 0, buffering.limit(), "ISO-8859-1"); } } else { buffering.put(source); //heres eclipse is telling that at this point it can only be null if( !buffering.hasRemaining() ){ // message is complete session.removeAttribute("BUFFER_NAME"); String data = new String( buffering.array(), 0, buffering.limit(), "ISO-8859-1"); } else { return; } } Thanks again. -----Mensagem original----- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 23:43 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer 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 > > > > > >