Android + Apache MINA не запускает messageSent() после session.write()

В чем может быть проблема с Apache MINA, если он не вызывает метод messageSent() после записи в активный сеанс? Мой код отлично работает в простом клиенте Java, но не работает в приложении Android.

Код TCPClient:

if (session != null && session.isConnected()) {
            throw new IllegalStateException("Already connected. Disconnect first.");
        }

        connector = new NioSocketConnector();
        connector.getSessionConfig().setUseReadOperation(true);

        try {
            SslFilter sslFilter = new SslFilter(ClientSslContextFactory.getInstance());
            sslFilter.setUseClientMode(true);
            connector.getFilterChain().addFirst("sslFilter", sslFilter);

            handler = new TCPHandler();
            connector.setHandler(handler);
            connector.getSessionConfig().setReadBufferSize(4096);

            // try to connect to server
            Log.d(TAG, "Connecting...");
            ConnectFuture future = connector.connect(new InetSocketAddress(Const.hostIP, Const.sessionPort));
            future.addListener(new IoFutureListener<IoFuture>() {

                public void operationComplete(IoFuture future) {
                    ConnectFuture connFuture = (ConnectFuture) future;
                    if(connFuture.isConnected()){
                        Log.d(TAG, "Assigning session...");
                        session = future.getSession();

                    } else {
                        Log.e(TAG, "Not connected...exiting");
                    }
                }
            });
            future.awaitUninterruptibly();
        } catch (RuntimeIoException e) {
            Log.e(TAG, "Failed to connect.");
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            Log.e(TAG, "Failed to connect. Illegal Argument! Terminating program!");
            e.printStackTrace();
        } catch (GeneralSecurityException e) {
            Log.e(TAG, "Failed to set SSL filter!");
            e.printStackTrace();
        }

Код отправки TCPHandler:

@Override
    public void sessionOpened(IoSession session) throws Exception {
        super.sessionOpened(session);
        Log.d(TAG, "Session opened...");

        byte[] ba = ("stringasdfasdf\n").getBytes();
        IoBuffer buffer = IoBuffer.allocate(ba.length);
        buffer.put(ba);
        buffer.flip();
        session.write(buffer);
        Log.d(TAG, "TCP writing executed.");
    }

person Jakub Turcovsky    schedule 16.02.2015    source источник


Ответы (2)


У меня такая же проблема, и я заметил, что это важно:

@Override
public void sessionCreated(IoSession session) throws Exception {
    Log.d(TAG, "sessionCreated");
    session.setAttribute(SslFilter.USE_NOTIFICATION);
}

После добавления session.setAttribute(SslFilter.USE_NOTIFICATION). Оно работает.

person Yeung    schedule 12.12.2018

connector.connect не может работать в основном потоке Android. Вы уверены, что session открыт?

person tesla1984    schedule 07.04.2016