Thanks Norman,
I try to use your example and I checked that when the host send a message
the receiver throws the exception
org.apache.mina.filter.codec.ProtocolDecoderException:
java.nio.BufferUnderflowException (Hexdump: AC ... 72).
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
byte[] byteVal = new byte[in.capacity()];
if (in.hasRemaining()){
in.get(byteVal , 0, in.capacity());
BasicMessage m = createBasicMessage(byteVal);
System.out.println("RECEIVED FROM " + m.getSender() +
"\n");
out.write(m);
return true;
} else {
return false;
}
If I read the buffer with the fuction array() the insertion into byteVal
works but the buffer is not consumed and the receiver throws the ecception
java.lang.IllegalStateException: doDecode() can't return true when buffer is
not consumed. (Hexdump: AC ... 63). There is the function that consumes the
buffer?
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
byte[] byteVal = new byte[in.capacity()];
if (in.hasRemaining()){
byteVal = in.array();
BasicMessage m = createBasicMessage(byteVal);
System.out.println("RECEIVED FROM " + m.getSender() +
"\n");
out.write(m);
return true;
} else {
return false;
}
Thanks
Sia
Norman Maurer-4 wrote:
>
> 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
>>
>
>
--
View this message in context:
http://old.nabble.com/why-host-received-many-message--tp27467512p27477642.html
Sent from the Apache MINA User Forum mailing list archive at Nabble.com.