4

ネットワーク IO に Apache Mina を使用して 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 ソケットは機能するので、これは回避策ですが、すべてのネットワーク コードを書き直すことは避けたいと考えています。

4

0 に答える 0