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