Hi there,
I was writing some prototype codes that uses MINA to broadcast some message
in a heterogeneous network.
For simplicity and fast development time, I used
ObjectSerializationEncoder/Decoder.
Somehow, a exception was occurred when sending messages(serializable object)
between a windows machine and a linux machine. (detailed exception stack
trace is attached at the end of this post.)
Messages sent from windows to windows boxes are fine.
Plain strings between windows and Linux also been received normally.
I just wonder if anyone has met this problem before?
Thanks in advance,
Qi
13 Dec. 2007
I'm using MINA 1.1.5.
The windows machine has windows XP SP2 (32bit), JRE 1.6.0 installed.
The Linux machine has fedora 5 (Linux version 2.6.20-1.2320.fc5) and JRE
1.6.0.
Here's the full stack trace:
ExpiringMapExpirer-1 [INFO ] [/192.168.1.100:3207] CLOSE -
mina.BroadcastReceiver$1
ExpiringMapExpirer-1 [INFO ] [/192.168.1.100:3207] CLOSED -
mina.BroadcastReceiver$1
session closed
DatagramAcceptor-0 [INFO ] [/192.168.1.21:33435] CREATED -
mina.BroadcastReceiver$1
session created
DatagramAcceptor-0 [INFO ] [/192.168.1.21:33435] OPENED -
mina.BroadcastReceiver$1
DatagramAcceptor-0 [INFO ] [/192.168.1.21:33435] RECEIVED: HeapBuffer[pos=0
lim=106 cap=128: 00 00 00 66 AC ED 00 05 73 72 00 27 62 6F 6F 2E 63 6F 6D 6D
6F 6E 73 2E 63 61 63 68 65 2E 65 76 65 6E 74 2E 4D 6F 63 6B 59 6F 6F 62 65
72 45 76 65 6E 74 78 72 00 2B 62 6F 6F 2E 63 6F 6D 6D 6F 6E 73 2E 63 61 63
68 65 2E 65 76 65 6E 74 2E 41 62 73 74 72 61 63 74 59 6F 6F 62 65 72 45 76
65 6E 74 78 70 74 00 03 31 32 33] - mina.BroadcastReceiver$1
DatagramAcceptor-0 [WARN ] [/192.168.1.21:33435] EXCEPTION: -
mina.BroadcastReceiver$1
org.apache.mina.filter.codec.ProtocolDecoderException:
org.apache.mina.common.BufferDataException: java.io.EOFException (Hexdump:
empty)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:164)
at
org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
at
org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
at
org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
at
org.apache.mina.filter.LoggingFilter.messageReceived(LoggingFilter.java:89)
at
org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
at
org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
at
org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
at
org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:499)
at
org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
at
org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:293)
at
org.apache.mina.transport.socket.nio.support.DatagramAcceptorDelegate.readSession(DatagramAcceptorDelegate.java:400)
at
org.apache.mina.transport.socket.nio.support.DatagramAcceptorDelegate.processReadySessions(DatagramAcceptorDelegate.java:368)
at
org.apache.mina.transport.socket.nio.support.DatagramAcceptorDelegate.access$1200(DatagramAcceptorDelegate.java:61)
at
org.apache.mina.transport.socket.nio.support.DatagramAcceptorDelegate$Worker.run(DatagramAcceptorDelegate.java:320)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.mina.common.BufferDataException: java.io.EOFException
at org.apache.mina.common.ByteBuffer.getObject(ByteBuffer.java:1530)
at
org.apache.mina.filter.codec.serialization.ObjectSerializationDecoder.doDecode(ObjectSerializationDecoder.java:92)
at
org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:133)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:157)
... 16 more
Caused by: java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(Unknown
Source)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(Unknown
Source)
at java.io.ObjectInputStream.readUTF(Unknown Source)
at java.io.ObjectStreamClass.readNonProxy(Unknown Source)
at java.io.ObjectInputStream.readClassDescriptor(Unknown Source)
at
org.apache.mina.common.ByteBuffer$3.readClassDescriptor(ByteBuffer.java:1516)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.apache.mina.common.ByteBuffer.getObject(ByteBuffer.java:1528)
... 19 more
Exception caught
ExpiringMapExpirer-1 [INFO ] [/192.168.1.21:33435] CLOSE -
mina.BroadcastReceiver$1
ExpiringMapExpirer-1 [INFO ] [/192.168.1.21:33435] CLOSED -
mina.BroadcastReceiver$1
session closed
/****************************************
The acceptor code:
BroadcastReceiver.java
*******************************************/
package mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.PooledByteBufferAllocator;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.common.ThreadModel;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.DatagramAcceptor;
import org.apache.mina.transport.socket.nio.DatagramAcceptorConfig;
public class BroadcastReceiver {
public static void main(String[] args) throws IOException {
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
DatagramAcceptor receiver = new DatagramAcceptor();
DatagramAcceptorConfig config = new DatagramAcceptorConfig();
config.setThreadModel(ThreadModel.MANUAL);
config.getSessionConfig().setBroadcast(true);
config.getSessionConfig().setReuseAddress(true);
config.getFilterChain().addLast("log", new LoggingFilter());
ObjectSerializationCodecFactory oscf = new
ObjectSerializationCodecFactory();
oscf.setDecoderMaxObjectSize(1048576);
config.getFilterChain().addLast("codec",
new ProtocolCodecFilter(oscf));
receiver.bind(new InetSocketAddress(7500), new
IoHandlerAdapter() {
@Override
public void exceptionCaught(IoSession session,
Throwable cause)
throws Exception {
System.out.println("Exception caught");
cause.printStackTrace();
}
@Override
public void messageReceived(IoSession session, Object
message)
throws Exception {
System.out.println("message received:" +
message.toString());
}
@Override
public void sessionClosed(IoSession session) throws
Exception {
System.out.println("session closed");
}
@Override
public void sessionCreated(IoSession session) throws
Exception {
System.out.println("session created");
}
}, config);
}
}
/*******************************************
*The connector side code:
BroadcastSender.java
*******************************************/
package mina;
import java.net.InetSocketAddress;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.PooledByteBufferAllocator;
import org.apache.mina.common.ThreadModel;
import org.apache.mina.common.WriteFuture;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.DatagramConnector;
import org.apache.mina.transport.socket.nio.DatagramConnectorConfig;
public class BroadcastSender {
public static void main(String[] args) {
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new PooledByteBufferAllocator());
DatagramConnector sender = new DatagramConnector();
DatagramConnectorConfig config = new DatagramConnectorConfig();
config.getFilterChain().addFirst("log", new LoggingFilter());
config.getFilterChain().addFirst("codec",
new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
config.getSessionConfig().setBroadcast(true);
config.setConnectTimeout(2);
config.setThreadModel(ThreadModel.MANUAL);
config.getSessionConfig().setReuseAddress(true);
ConnectFuture cf = sender.connect(new InetSocketAddress("192.168.1.255",
7500),
new IoHandlerAdapter() {
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace();
System.out.println("exceptionCaught");
}
@Override
public void messageSent(IoSession session, Object message) throws
Exception {
System.out.println("messageSent");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}, config);
cf.join();
if (cf.isConnected()) {
IoSession session = cf.getSession();
WriteFuture wf = session.write(new MockEvent("123"));
wf.join();
session.close();
session.getCloseFuture().join();
}
}
}
/*************************
MockEvent.java
************************/
package mina;
public class MockEvent implements Serializable {
private static final long serialVersionUID = -147055975212279720L;
private String message;
public MockEvent (String message) {
this.message = message;
}
public String toString() {
return message;
}
}
--
View this message in context:
http://www.nabble.com/Problem-when-use-ObjectSerializationCodecFactory-in-Datagram-broadcasting-between-linux-and-window-tp14311279s16868p14311279.html
Sent from the Apache MINA Support Forum mailing list archive at Nabble.com.