2011-10-21 60 views
1

我想用asmack在Android上編寫一個簡單的XMPP應用程序,但我遇到了一個問題,我無法登錄到幾個jabber服務器。例如,我無法登錄到我的測試Openfire服務器,儘管代碼可以在jabber.org帳戶中正常工作。Asmack/Openfire 401錯誤

登錄代碼:

public void login() throws XMPPException 
{ 
    if (connection != null && connection.isConnected()) 
    { 
     try 
     { 
      Random generator = new Random(); 
      int resource_int = generator.nextInt(); 
      connection.login(USERNAME, PASSWORD, 
          "Smack_" + Integer.toString(resource_int)); 
     } 
     catch (XMPPException e) 
     { 
      e.printStackTrace(); 
      connection.disconnect(); 
      setConnection(null); 
      throw e; 
     } 
     Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all); 
    } 
} 

正如我所說的,它的工作原理與jabber.org,但Openfire的返回not-authorized(401)錯誤。我該如何解決它?

+0

嘗試在登錄時刪除資源參數。 – Maggie

回答

0

我從來沒有使用Openfire,但我確定有一個日誌文件的地方 - 你可以發佈它?

在Android中的IIRC一些安全功能(不確定是否SSL或TLS)與Smack或Asmack不兼容,也許這就是問題所在。在這種情況下,有一種方法可以通過使用自己的Socket連接(而不是Smack的SSL功能)來解決它 - 要驗證這一點,您可以將與(XMPP相關的)代碼移植到PC並使用標準Smack庫。

另一點是,Android有不同的Smack端口。我個人使用Beem項目的Asmack端口(因爲最初的Asmack有一些問題 - 但我不記得哪些是...)

但是......沒有更多信息我只能猜測。

+0

他的問題是它可以在一臺服務器上運行,但不能在另一臺服務器上運行。這不太可能是客戶端的問題,因爲它在兩種情況下都會失敗。 – Robin

+1

不一定......也許服務器需要不同的登錄機制。在Asmack中,您可以啓用調試模式('ConnectionConfiguration.setDebuggerEnabled(bool)'),以便您可以跟蹤LogCat中的節,也許在那裏可以找到有用的區別。 –

0

您確定您在OpenFire服務器上擁有相同的帳戶和密碼嗎?嘗試使用與現有XMPP客戶端相同的用戶名和密碼登錄到您的服務器。完全將Android排除在外,並確保您可以先登錄到兩臺服務器。