2013-03-28 51 views
2

我正在開發基於XMPP和Smack API的聊天服務器,該服務器連接到Openfire服務器(由也正在開發此項目的朋友託管)。因此,我在幾天前開始對它進行編程(Netbeans on OS X 10.8),今天我開始了連接和登錄方面的工作。如何使用Smack XMPP API處理(失敗的)登錄嘗試

我可以用正確的用戶名+密碼選擇完美登錄:P但我不知道如何處理無效的登錄嘗試,並讓應用程序顯示一條消息,然後允許用戶重試。

這裏是我的代碼,用戶在我的揮杆JForm按下一個按鈕後,它將觸發:

(注:XMPPConnection對象是在另一個類已經創建,連接已經與服務器建立可以看到我打電話從另一個類的對象)

private void btnIniciarSesionActionPerformed(java.awt.event.ActionEvent evt) {             
    String Usuario = txtUsuario.getText(); 
    String Password = new String (pwdContrasena.getPassword()); 

    if (Usuario.equals("") || Password.equals("")){ 
     // Missing data 
     JOptionPane.showMessageDialog(null, "Missing data"); 
    } 
    else{ 
     //Try to login 
     try{ 
      Proyecto_chat.conexion.login(Usuario, Password, "x"); 
     } 
     catch (XMPPException ex){ 
      Logger.getLogger(Ventana_login.class.getName()).log(Level.SEVERE, null, ex); 
      // Problem 
     } 
     if (Proyecto_chat.conexion.isAuthenticated() == true){ //Login has been successful 
      jLabel1.setVisible(false); 
      System.out.println("Authenticated as " + Usuario); 
      JOptionPane.showMessageDialog(null, "Authenticated as " + Usuario); 
      //Exit login window and carry on 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "login error"); 
     } 
    } 
} 

我應該用異常我得到發揮? - >

SEVERE: null 
SASL authentication DIGEST-MD5 failed: not-authorized: 
at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:337) 
at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203) 
at proyecto_chat.Ventana_login.btnIniciarSesionActionPerformed(Ventana_login.java:159) 
at proyecto_chat.Ventana_login.access$100(Ventana_login.java:15) 
at proyecto_chat.Ventana_login$2.actionPerformed(Ventana_login.java:73) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
(...) more lines that I think are not critical for this 

(大學項目,所以也無所謂)作爲密碼存儲在純文本簡化從應用程序中改變它們,我可以連接到數據庫(PostgreSQL的遠程服務器)從客戶端計算機,並檢查密碼,只有'conexion.login'如果用戶&通過匹配,但這將是...你知道...錯誤

在環顧四周,沒有運氣,我決定要在這裏頭,要求,第二天早上睡覺,並提出一些建議;) 幫助,將不勝感激

回答

1

其實,主要的問題是,當我嘗試使用無效的用戶名/密碼登錄,一些異常被拋出(除了我建立了一個信息顯示),但應用程序不會讓我登錄再次(如果我更正了我的數據並再次單擊該按鈕)。

我終於通過將.connect()放在.login()方法後面並在發生錯誤登錄時調用.disconnect()來解決此問題,因此每次用戶嘗試重新連接服務器時都會重新連接服務器登錄 。

這可能不是理想的方法,但是我覺得很容易,做,能。感謝您的幫助!

1

不知道如果我明白你問什麼,但如果它是「我怎麼能確定與啪登錄嘗試失敗的原因嗎?」那麼這裏是我的答案:

如果你想確定登錄失敗的原因,你必須評估(XMPP)異常的消息字串Smack 3.2.2。的各種故障原因,分清這些消息字符串目前硬編碼在源,這通常不是一個好主意。

前一陣子我創建了SMACK-416 "Improve Exceptions on connect() and login()"來解決這個問題。這個想法是用類層次結構替換硬編碼的字符串/失敗原因。但它肯定會需要幾個月的時間,直到這個實現(也許數週/月/年直到它被釋放)。

+0

其實,主要的問題是,當我嘗試使用無效的用戶名/密碼登錄,一些異常被拋出(除了我建立了一個信息顯示),但應用程序不會讓我再次登錄(就像我更正了我的數據並再次點擊按鈕)。我終於通過放置'來解決這個問題。connect()'在'.login()'方法的後面,並且在發生錯誤登錄時調用'.disconnect()',這樣每次用戶嘗試登錄時都會重新連接服務器。 – fernandopcg 2013-03-28 16:32:02

+0

這將會很棒如果這些功能實際上在連接失敗等方面更「冗長」);) – fernandopcg 2013-04-04 21:29:29