Android Smack дает исключение тайм-аута при присоединении к MultiUserChat

Я пытаюсь присоединиться к MultiUserChat, используя Smack на Android. В настоящее время я могу общаться 1 на 1 совершенно нормально, и я подключен к серверу, как я показываю онлайн. Я следовал примерам, представленным здесь.

У меня есть следующий код для присоединения к MultiUserChat (MUC).

final XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
        .setUsernameAndPassword(user.getUsername(), user.getJabberPassword())
        .setServiceName("app.buur.nu")
        .setHost("app.buur.nu")
        .setPort(5222)
        .build();

AbstractXMPPConnection connection = new XMPPTCPConnection(config);

String room = "testroom";
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = manager.getMultiUserChat(room + "@groups.app.buur.nu"); 
try {
    muc.join(user.getUsername(), null, null, connection.getPacketReplyTimeout());
} catch (SmackException.NoResponseException e) {
    e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
    e.printStackTrace();
} catch (SmackException.NotConnectedException e) {
    e.printStackTrace();
}

Но это дает мне org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: AndFilter: (FromMatchesFilter (full): [email protected]/test, StanzaTypeFilter: org.jivesoftware.smack.packet.Presence).

Я попытался увеличить тайм-аут до 10000 мс, но я все равно получаю тайм-аут. Что здесь может быть не так? Создание чатов 1-на-1 работает нормально, и connection.isConnected()) возвращает True...


Вот и получается, что я получаю ошибку

<presence to="app.buur.nu/7c65be6" id="lgcSp-4" type="error"><x xmlns="http://jabber.org/protocol/muc"/><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/><error code="401" type="auth"><not-authorized xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>

По сути, аутентификация не завершена, когда я пытаюсь присоединиться к комнате. Можно ли добавить прослушиватель для получения обновлений после завершения аутентификации? Я видел https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/SASLAuthentication.html#authenticate%28java.lang.String,%20javax.security.auth.callback.CallbackHandler%29, но реализация моего собственного механизма аутентификации кажется немного излишним...

Разве там нет onAuthenticationCompletedListener или что-то в этом роде?


person Gooey    schedule 24.09.2015    source источник
comment
След строфы был бы проницательным. Взгляните на github.com/igniterealtime/Smack/wiki/   -  person Flow    schedule 24.09.2015
comment
@Flow обновит мой пост   -  person Gooey    schedule 25.09.2015
comment
В присутствии отсутствует атрибут «от». Какая реализация предоставляет службу MUC?   -  person Flow    schedule 25.09.2015
comment
Я использую openfire в качестве сервера XMPP.   -  person Gooey    schedule 25.09.2015


Ответы (2)


Получается нет необходимости реализовывать SASLMechanism, можно сделать следующее:

connection.addConnectionListener(new ConnectionListener() {
        @Override
        public void connected(XMPPConnection connection) {

        }

        @Override
        public void authenticated(XMPPConnection connection, boolean resumed) {
            joinMUCRooms();
        }

        @Override
        public void connectionClosed() {

        }

        @Override
        public void connectionClosedOnError(Exception e) {

        }

        @Override
        public void reconnectionSuccessful() {

        }

        @Override
        public void reconnectingIn(int seconds) {

        }

        @Override
        public void reconnectionFailed(Exception e) {

        }
    });

Ошибка больше не отображается, при этом код остается «достаточно» чистым.

person Gooey    schedule 25.09.2015
comment
Я сделал то же самое, что вы сказали выше, но все еще получаю то же исключение. Что-нибудь еще я могу сделать, чтобы решить проблему? - person Nooruddin Lakhani; 28.06.2016

Комната существует? Если нет, вам нужно сначала создать его, используя create() и отправив мгновенную форму. Вы также должны сообщить разработчикам openfire, что в наличии ошибки MUC отсутствует атрибут «от».

person Flow    schedule 25.09.2015