我正在开发一个使用 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();
此外,如果我在同样的事情发生后移动 write 调用。
有没有人有类似的问题?Android 上的 Mina 是否存在已知问题?我是否缺少一些会话配置选项?由于正常的 SSL 套接字工作,这是一种解决方法,但我宁愿不重写我所有的网络代码。