最近想在自己做的安卓手机应用中加入即时聊天功能,于是想到了用Mina来实现,也是由于自己想着偷懒,借用了官方的example中chat的相关代码,经过一番改造,很快就能在java环境中正常运行了。确认没问题后,将client端代码移到了Android中,但是移植过程中并不顺利,每次都是Java.lang.NoclassDefFoundError,提示java.lang.NoClassDefFoundError: org/apache/mina/core/filterchain/IoFilterEvent,但实际上这个类是存在的,一时间不知道问题出在哪。
源码如下:
public boolean connect(NioSocketConnector connector, SocketAddress address,
boolean useSsl) {
if (session != null && session.isConnected()) {
throw new IllegalStateException(
"Already connected. Disconnect first.");
}
try {
IoFilter LOGGING_FILTER = new LoggingFilter();
IoFilter CODEC_FILTER = new ProtocolCodecFilter(
new TextLineCodecFactory());
connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
connector.getFilterChain().addLast("codec", CODEC_FILTER);
connector.getFilterChain().addLast("logger", LOGGING_FILTER);
if (useSsl) {
SSLContext sslContext = BogusSslContextFactory
.getInstance(false);
SslFilter sslFilter = new SslFilter(sslContext);
sslFilter.setUseClientMode(true);
connector.getFilterChain().addFirst("sslFilter", sslFilter);
}
connector.setHandler(handler);
ConnectFuture future1 = connector.connect(address);
future1.awaitUninterruptibly();
if (!future1.isConnected()) {
return false;
}
session = future1.getSession();
login();
return true;
} catch (Exception e) {
return false;
}
}
原本以为是安卓版本或者Mina版本的问题,结果尝试了几个版本都存在同样的问题,只好慢慢找原因。最终找到原因,只要加入了mdc过滤器,那么就会报这样的错误,所以在Server端和Client端都注掉acceptor.getFilterChain().addLast("mdc", new MdcInjectionFilter())这一行,之后一切恢复正常。