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