Dears,
I'm writing my first codec for a peer MINA 2.0.0 system for communication and 
I have some problem...

This is the exception:
AVVERTENZA: EXCEPTION :
org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.
BufferUnderflowException (Hexdump: 00 ... 53)
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived
(ProtocolCodecFilter.java:235)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.
callNextMessageReceived(DefaultIoFilterChain.java:433)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200
(DefaultIoFilterChain.java:47)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.
messageReceived(DefaultIoFilterChain.java:801)
        at 
org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:71)
        at org.apache.mina.filter.logging.MdcInjectionFilter.filter
(MdcInjectionFilter.java:136)
        at org.apache.mina.filter.util.CommonEventFilter.messageReceived
(CommonEventFilter.java:70)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.
callNextMessageReceived(DefaultIoFilterChain.java:433)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200
(DefaultIoFilterChain.java:47)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.
messageReceived(DefaultIoFilterChain.java:801)
        at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived
(IoFilterAdapter.java:119)
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.
callNextMessageReceived(DefaultIoFilterChain.java:433)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived
(DefaultIoFilterChain.java:425)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.read
(AbstractPollingIoProcessor.java:603)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process
(AbstractPollingIoProcessor.java:563)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process
(AbstractPollingIoProcessor.java:552)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400
(AbstractPollingIoProcessor.java:56)
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run
(AbstractPollingIoProcessor.java:891)
        at 
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.
java:64)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown 
Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.nio.BufferUnderflowException
        at 
org.apache.mina.core.buffer.AbstractIoBuffer.getObject(AbstractIoBuffer.
java:1937)
        at 
org.apache.mina.core.buffer.AbstractIoBuffer.getObject(AbstractIoBuffer.
java:1927)
        at 
it.unipr.aotlab.hds.impl.distribution.mina.peer.MessageDecoder.doDecode
(MessageDecoder.java:21)
        at org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode
(CumulativeProtocolDecoder.java:178)
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived
(ProtocolCodecFilter.java:225)

That are piece of my code...

(NioSocketAcceptor)
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));



(NioSocketConnector)
IoFilter CODEC_FILTER = new ProtocolCodecFilter(new MessageCodecFactory() );
connector.getFilterChain().addLast("codec", CODEC_FILTER);



(MessageCodecFactory)
public class MessageCodecFactory implements ProtocolCodecFactory {
    private ProtocolEncoder encoder;
    private ProtocolDecoder decoder;
    public MessageCodecFactory() {
        encoder = new MessageEncoder();
        decoder = new MessageDecoder();
    }
    public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception {
        return encoder;
    }
    public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception {
        return decoder;
    }
}



(MessageEncoder)
public class MessageEncoder implements ProtocolEncoder {
    public void encode(IoSession session, Object message, 
ProtocolEncoderOutput out) throws Exception {
        System.out.println("codifico");
        BasicMessage m = (BasicMessage) message;
        IoBuffer buffer = IoBuffer.allocate(1200);
        buffer.setAutoExpand(true);
        buffer.putInt(m.getID());
        buffer.putString(m.getSender(), Charset.defaultCharset().
newEncoder());
        buffer.putString(m.getReceiver(), Charset.defaultCharset().
newEncoder());
        buffer.putObject(m.getContent());
        buffer.putObject(m.getType());
        buffer.flip();
        out.write(buffer);
    }
}


(MessageDecoder)
public class MessageDecoder extends CumulativeProtocolDecoder {
    protected boolean doDecode(IoSession session, IoBuffer in, 
ProtocolDecoderOutput out) throws Exception {
        if (in.remaining() >= 12) {
                int id = in.getInt();
                String s = in.getString(Charset.defaultCharset().newDecoder());
                String r = in.getString(Charset.defaultCharset().newDecoder());
                Content c = (Content)in.getObject();
                Type t = (Type)in.getObject();
            BasicMessage m = new BasicMessage(id, s, r, c, t);
                out.write(m);
            return true;
        } else {
            return false;
        }
    }
}



(BasicMessage)
public final class BasicMessage implements Message
{
  private static final long serialVersionUID = 1L;
  private int id;
  private String sender;
  private String receiver;
  private Content content;
  private int reply;
  private Type type;

(get and set method)
}



(MessageHandler)
(...)
public void messageReceived(IoSession session, Object message)
            throws Exception {
                System.out.println("RICEVO: " + message.getClass().getName() + 
" " + 
message);
        BasicMessage msg = (BasicMessage) message;
        callback.msgReceived(session, msg);
    }
(...)


Someone can help me? please!

Thanks
Sia

Reply via email to