ChannelFutureListener.operationComplete of SslHandler.handshake() не вызывается на Android

Я использую netty-3.6.6 SSL в своем приложении для Android. На самом деле рукопожатие () выполняется (приложение Android может отправлять/получать данные на/с сервера SSL), но OperationComplete никогда не вызывается. Мне нужно, чтобы он вызывался для выполнения некоторых задач.

Что-то я пропустил или сделал не так? Спасибо.

Ниже приведены настройки и фрагмент кода.

@Override
public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pip = Channels.pipeline();
        SSLEngine engine = SslContextFactory.getClientContext().createSSLEngine();
        engine.setUseClientMode(true);
        SslHandler sslHandler = new SslHandler(engine);
        sslHandler.setIssueHandshake(false);
        pip.addLast("ssl", sslHandler);
        ...
        return pip;
}

@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelConnected");
        SslHandler sslHandler = ctx.getPipeline().get(SslHandler.class);
        if (sslHandler != null) {
            // Begin handshake.
            ChannelFuture handshakeFuture = sslHandler.handshake();
            handshakeFuture.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {

                    if (!future.isSuccess()) {
                        System.out.println("handshake failed(" + future.getCause() + ")");
                    } else {
                        System.out.println("handshake OK");
                    }
                }
            });
        }
    }

}

person larryt    schedule 06.09.2013    source источник
comment
Использование netty-3.7.0 по-прежнему имеет ту же проблему.   -  person larryt    schedule 09.09.2013


Ответы (1)


netty может не обрабатывать состояние ChannelFuture, возвращенное моему приложению, которое правильно вызывает SslHandler.handshake(). Я добавил hsFuture.setSuccess() в SslHandler.handshake(), и моя операция OperationComplete была вызвана.

public ChannelFuture handshake() {
        ...
        if (exception == null) { // Began handshake successfully.
            try {
                final ChannelFuture hsFuture = handshakeFuture;
                wrapNonAppData(ctx, channel).addListener(new ChannelFutureListener() {
                    public void operationComplete(ChannelFuture future) throws Exception {
                        if (!future.isSuccess()) {
                            Throwable cause = future.getCause();
                            hsFuture.setFailure(cause);

                            fireExceptionCaught(ctx, cause);
                            if (closeOnSSLException) {
                                Channels.close(ctx, future(channel));
                            }
                        } else {
                            hsFuture.setSuccess();
                        }
                    }
                });
            } catch (SSLException e) {
person larryt    schedule 09.09.2013
comment
Эта проблема была исправлена ​​этой фиксацией. Пожалуйста, получите последнюю сборку моментального снимка, чтобы увидеть, работает ли исправление для вас, и дайте мне знать. - person trustin; 18.04.2014
comment
Вы можете получить последний снимок здесь для 3.9. - person trustin; 18.04.2014