4

我正在开发一个使用 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 套接字工作,这是一种解决方法,但我宁愿不重写我所有的网络代码。

4

0 回答 0