我正在尝试使用smack来连接到微软的Xmpp Msn api。去年4月,他们对实现进行了更改,迫使客户实现“see-other-host”xmpp规范。当我尝试连接到“xmpp.messenger.live.com”时,我得到了
stream:error(请参阅-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>
但是我无法找到一种方法来拦截和处理重定向。 有人这样做过吗?任何帮助,将不胜感激。感谢。
BTW我已经在smack论坛发帖了但没有回复,希望这不被认为是交叉发布。
答案 0 :(得分:2)
此背景可能有助于解决问题
see-other-host流错误将客户端重定向到另一台服务器。对于Messenger,它旨在允许客户端在其当前服务器停止服务时干净地切换到另一台服务器,或者为了负载平衡目的而连接到另一台服务器。
基于使用SAMCK的示例Java代码,存在两个问题:
在内部处理重定向将是最友好的解决方案,但通知新服务器的客户端将至少允许客户端在没有用户干预的情况下建立新连接。
答案 1 :(得分:0)
我为SMACK API添加了see-other-host支持以供尝试。现在我可以看到其他主机地址作为例外。例如,当我尝试连接到messenger.live.com地址时,我成功地看到了其他主机: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流量捕获。 最好的祝福, Alper Ozdamar
答案 2 :(得分:0)
我终于通过在ConnectionConfiguration构造函数中将主机名从messenger.live.com
更改为64.4.61.217
来找到解决此问题的方法,如下面的代码所示:
我通过在Dos命令提示符中执行(nslookup messenger.live.com
)得到了这个IP,然后我得到了一个我在ConnectionConfiguration中使用过的地址。
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);
希望这会有所帮助,,,