You should not use IoByteBuffer.array(), array() will not "move" forward in the IoByteBuffer. Use something like:
byte[] byteVal = new byte[in.capacity()]; in.get(byteVal , 0, byteVal.length); BasicMessage m = createBasicMessage(byteVal); Bye, Norman 2010/2/5 [email protected] <[email protected]>: > Dears... > I have always problem with my first mina Decoder that work on a P2P system. > When I send a message cast it into a byte[]; I control that I receive and send > the same byte[]. > The cast from byte[] to my Object (BasicMessage) is correct! > > My problem is that the program print line ++++++++++++++++ many times, I > belive that host receive the message many times... > > > > > public class MessageDecoder extends CumulativeProtocolDecoder { > > protected boolean doDecode(IoSession session, IoBuffer in, > ProtocolDecoderOutput out) throws Exception { > byte[] byteVal = null; > if (in.hasRemaining()){ > byteVal = in.array(); > BasicMessage m = createBasicMessage(byteVal); > System.out.println("RICEVUTO DA " + m.getSender() + > "\n"); ++++++++++++++++ > out.write(m); > in.get(); > return true; > } else { > return false; > } > } > > public static BasicMessage createBasicMessage(byte[] bytes){ > Object object = null; > try{ > object = new java.io.ObjectInputStream(new > java.io.ByteArrayInputStream > (bytes)).readObject(); > }catch(java.io.IOException ioe){ > > java.util.logging.Logger.global.log(java.util.logging.Level.SEVERE, ioe. > getMessage()); > }catch(java.lang.ClassNotFoundException cnfe){ > > java.util.logging.Logger.global.log(java.util.logging.Level.SEVERE, cnfe. > getMessage()); > } > return (BasicMessage)object; > } > } > > > > > public class MessageEncoder implements ProtocolEncoder { > > public void encode(IoSession session, Object message, > ProtocolEncoderOutput out) throws Exception { > BasicMessage m = (BasicMessage) message; > IoBuffer buffer = IoBuffer.allocate(12); > buffer.setAutoExpand(true); > byte[] byteVal = createArrayByte(m); > buffer.put(byteVal); > buffer.flip(); > out.write(buffer); > } > > public byte[] createArrayByte (BasicMessage obj) throws IOException{ > ByteArrayOutputStream bStream = new ByteArrayOutputStream(); > ObjectOutputStream oStream = new ObjectOutputStream( bStream ); > oStream.writeObject ( obj ); > oStream.flush(); > oStream.close(); > bStream.close(); > byte[] byteVal = bStream. toByteArray(); > return byteVal; > } > > } > > > Thanks > Sia >
