2

我正在开发一个基于 XMPP 和 Smack API 的聊天服务器,它连接到一个 Openfire 服务器(由一个也和我一起开发的朋友托管)。

所以,我几天前才开始编程(OS X 10.8 上的 Netbeans),今天我继续讨论连接和登录方面。

我可以通过正确选择用户名+密码完美登录:P 但我不知道如何处理无效的登录尝试并让应用程序显示一条消息,然后允许用户重试。

这是我的代码,它在用户按下我的 Swing 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”,但那将是......你知道......错了

在网上四处寻找没有运气之后,我决定去这里,问问,睡觉,第二天早上醒来,提出一些建议;)感谢您的帮助

4

2 回答 2

1

不确定我是否理解您的要求,但如果是“我如何确定 Smack 登录尝试失败的原因?” 那么这是我的答案:

如果您想确定登录失败的原因,您必须从 Smack 3.2.2 开始评估 (XMPP)Exception 的消息字符串。这些区分各种失败原因的消息字符串目前在源代码中是硬编码的,这通常不是一个好主意。

不久前,我创建了SMACK-416 “改进 connect() 和 login() 上的异常”来解决这个问题。这个想法是用类层次结构替换硬编码的字符串/失败原因。但它肯定需要几个月的时间才能实施(可能需要几周/几个月/几年才能发布)。

于 2013-03-28T13:13:27.377 回答
1

实际上,主要问题是当我尝试使用无效的用户名/密码登录时,抛出了一些异常(以及我设置的信息显示),但应用程序不允许我再次登录(好像我更正了我的数据并再次单击该按钮)。

我终于通过将 .connect() 放在 .login() 方法后面来解决这个问题,并在登录错误的情况下调用 .disconnect() ,因此每次用户尝试登录时都会重新连接服务器。

这可能不是理想的方法,但我发现它既简单又可行。感谢您的帮助!

于 2013-03-28T16:34:23.287 回答