我正在使用Apache Mina开发一个用于网络IO的Android应用程序。非SSL连接(读取,写入)工作正常,但是一旦我添加SSL过滤器,就会停止工作。 我也尝试过纯SSL套接字,它们工作正常。
这是我的Mina连接代码(在一个单独的网络线程中):
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
SocketSessionConfig cfg = (SocketSessionConfig)connector.getSessionConfig();
cfg.setTcpNoDelay(true);
SslContextFactory f = new SslContextFactory();
f.setTrustManagerFactory(new BogusTrustManagerFactory());
f.setProtocol("SSL");
try {
filter = new SslFilter(f.newInstance(), true);
} catch (Exception e) {
Log.d(TAG, "Exception: ", e);
return;
}
filter.setUseClientMode(true);
connector.getFilterChain().addLast("sslFilter", filter);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("ASCII"))));
connector.setHandler(new MinaClientHandler());
ConnectFuture future = connector.connect(new InetSocketAddress("10.0.1.9", 7072));
future.awaitUninterruptibly();
if (!future.isConnected())
{
Log.d(TAG, "not connected, return");
return;
}
IoSession session = future.getSession();
session.getConfig().setUseReadOperation(true);
session.getCloseFuture().awaitUninterruptibly();
//System.out.println(session.read().getMessage());
Log.d(TAG, "after writting");
connector.dispose();
在我的IoHandlerAdapter中,我有以下覆盖:
@Override
public void sessionOpened(IoSession session)
{
session.write(IoBuffer.wrap(data)); // byte array
}
不是我的实际代码,但它会重现问题。
在服务器端,我看到连接被接受,握手成功。但在客户端,没有任何内容通过套接字发送。我在桌面Java应用程序中尝试了相同的代码,它也可以工作。
此外,如果我在IoSession session = future.getSession();
之后移动写入调用,则会发生同样的事情。
有没有人有类似的问题? Android上的Mina是否存在已知问题?我错过了一些会话配置选项吗? 由于普通的SSL套接字有效,这是一种解决方法,但我宁愿不重写我的所有网络代码。