Обрабатывать см-другой-хозяин в smack

Я пытаюсь использовать smack для подключения к Microsoft Xmpp Msn API. В прошлом апреле они внесли изменения в свою реализацию, что вынуждает клиентов реализовывать спецификацию xmpp "see-other-host". Когда я пытаюсь подключиться к " xmpp.messenger.live.com", я получаю

Поток: ошибка (see-other-host) в org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:260) в org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43) в org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70)

Я отлаживаю и вижу необработанные полученные пакеты

    <stream:stream from="messenger.live.com" version="1.0" id="59784" xmlns="jabber:client"     xmlns:stream="http://etherx.jabber.org/streams">
<stream:features xmlns:stream="http://etherx.jabber.org/streams"><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required /></starttls></stream:features>
<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
<stream:stream from="messenger.live.com" version="1.0" id="59785" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">
<stream:error xmlns:stream="http://etherx.jabber.org/streams"><see-other-host xmlns="urn:ietf:params:xml:ns:xmpp-streams">BY2MSG3020517.gateway.edge.messenge r.live.com</see-other-host></stream:error>

Но я не могу найти способ перехватить и обработать это перенаправление. Кто-нибудь сделал это? Любая помощь будет оценена. Благодарю.

Кстати, я уже опубликовал это на форумах smack, но не получил ответа, надеюсь, это не считается перекрестной публикацией.

3 ответа

Этот фон может помочь в решении проблемы

Ошибка потока see-other-host перенаправляет клиента на другой сервер. В случае с Messenger он предназначен для того, чтобы клиенты могли без проблем переключаться на другой сервер, если их текущий сервер выходит из строя, или подключаться к другому серверу в целях балансировки нагрузки.

На основе примеров Java-кодов, использующих SAMCK, существуют две проблемы:

  1. Зарегистрированные слушатели соединения не получают уведомления об исключении
  2. нет способа получить доступ к текстовому элементу ошибки потока из XMPPException

Внутренняя обработка перенаправления была бы самым дружественным решением, но уведомление клиента о новом сервере, по крайней мере, позволило бы клиентам установить новое соединение без вмешательства пользователя.

Я добавил поддержку see-other-host в SMACK API, чтобы попробовать. Теперь я могу получить адрес see-other-host в качестве исключения. Например, когда я пытаюсь подключиться к адресу messenger.live.com, я успешно получаю сообщение see-other-host: BAYMSG1020118.gateway.messenger.live.com . Затем я пытаюсь подключиться к BAYMSG1020118.gateway.messenger.live.com, я снова получаю возможность увидеть другого хоста с другим адресом: BY2MSG4010610.gateway.messenger.live.com Наконец, когда я пытаюсь подключиться BY2MSG4010610.gateway.messenger.live.com, я получаю это исключение:

No response from the server.: 
java.lang.NullPointerException
at org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:73)
at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:211)
at org.jivesoftware.smack.Connection.login(Connection.java:348)
at com.ms.wlm.XmppClient.logIn(XmppClient.java:161)
at com.ms.wlm.Program.main(Program.java:62)

Я поделюсь этим результатом с парнями Smack также. Если вы хотите, я могу отправить вам захват нашего трафика xmpp по электронной почте. С наилучшими пожеланиями, Альпер Оздамар

Я наконец нашел решение этой проблемы, изменив имя хоста с messenger.live.com в 64.4.61.217 в конструкторе ConnectionConfiguration, как показано в коде ниже:

Я получил этот IP, выполнив (nslookup messenger.live.com) в командной строке DOS, то я получил адрес, который я использовал в конфигурации соединения.

    SASLAuthentication.registerSASLMechanism("X-MESSENGER-OAUTH2",
            XMessengerOAuth2.class);
    SASLAuthentication.supportSASLMechanism("X-MESSENGER-OAUTH2");
        ConnectionConfiguration config = new ConnectionConfiguration("64.4.61.217", 5222, "messenger.live.com");
        config.setRosterLoadedAtLogin(true);
        config.setSASLAuthenticationEnabled(true);
        connection = new XMPPConnection(config);

        connection.connect();

        connection.login(username, password);

Надеюсь, это поможет,,,

Другие вопросы по тегам