最近想在自己做的安卓手機應用中加入即時聊天功能,于是想到了用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())這一行,之后一切恢復正常。