2012-07-03 56 views
0

我想咂嘴使用,以連接到微軟的MSN XMPP API。去年4月,他們對其實施做出了改變,迫使客戶實施「查看其他主機」xmpp規範。當我嘗試連接到 「xmpp.messenger.live.com」 我得到手柄看到,其他主機在咂嘴

流:錯誤(見-其他主機) 在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我已經張貼此上咂嘴論壇,但都沒有迴音,希望這是不被認爲是交叉發佈。

回答

0

我添加SEE-其他主機支持嫌API的嘗試。現在我可以看到其他主機地址作爲例外。例如,當我嘗試連接到messenger.live.com地址我成功地看到其他主機:BAYMSG1020118.gateway.messenger.live.com。 然後我嘗試連接BAYMSG1020118.gateway.messenger.live.com,我又獲得SEE-其他主機的不同地址: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流量。 最好的問候, 阿爾珀Ozdamar

+0

我們最後修改咂嘴代碼,在哈克的方式,只是爲了處理看,其他主機,直到嫌oficially支持它。 感謝您的回覆。 – alscu

2

此背景可能在解決問題幫助

的看到,其他主機流錯誤將客戶端重定向到另一臺服務器。對於Messenger,它的目的是允許客戶端在他們當前的服務器停止服務或者爲了負載平衡目的而連接到另一臺服務器時乾淨地切換到另一臺服務器。

基於使用SAMCK示例Java代碼有兩個問題:

  1. 註冊的連接監聽器沒有收到異常
  2. 的通知沒有辦法訪問數據流差錯的文本元素來自XMPPException

在內部處理重定向將是最友好的解決方案,但通知客戶端新服務器至少允許客戶端在沒有用戶干預的情況下建立新連接。

+1

@alscu你會介意爲我們提供你在評論中提到的黑客方式,因爲我們可能從中受益並討論它並幫助其他人應對此SMACK BUG ...謝謝 –

0

我終於在ConnectionConfiguration構造找到了這個問題的解決方案,通過改變主機名從messenger.live.com64.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); 

希望這將有助於,,,