我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?

Posted

技术标签:

【中文标题】我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?【英文标题】:How do I know if an account exists in a XMPP server from the client?我如何从客户端知道一个帐户是否存在于 XMPP 服务器中? 【发布时间】:2011-04-19 08:28:32 【问题描述】:

我正在使用 Smack 库开发 IM 应用程序,但遇到了一些问题。

我想知道是否可以通过服务器中的用户名来检查用户是否存在。我的应用程序必须检查系统联系人列表中的人是否在我的服务器中打开了一个帐户,并且他们不在他们的朋友列表中。

到目前为止,我设法将系统联系人列表中的每个联系人添加到我的用户的服务器联系人列表中 - 即使他们事先没有帐户 - 但这不是我想要的。

这是代码(Contact 就像 Smack 的 RosterEntry 的包装类):

public void addAllContactsIfExisting(Contact[] contactsAgenda) 

    for (Contact contact: contactsAgenda) 
        if (!isContactMyFriend(contact)) 
            try 
                // I'd like to check for account existence here, being contact.getJid() the username as it'd be in the server
                conn.getRoster().createEntry(contact.getJid(), contact.getName(), null);
             catch (XMPPException e) 
                e.printStackTrace();
            
        
    

如果有帮助,我目前正在使用 Openfire 作为服务器。

【问题讨论】:

【参考方案1】:

您可以使用UserSearch 类搜索特定用户,如果在服务器上未找到该用户,则可以假设该用户未在服务器上注册。

【讨论】:

请注意 - 这种方法有一个限制,只能用于授权会话。因此,如果您尝试使用 id 可用性检查来实现自助注册,则需要另一种方法。【参考方案2】:

你可以试试这个片段来搜索用户:

public Boolean checkIfUserExists(String user) throws XMPPException
    UserSearchManager search = new UserSearchManager(xmppConnection);  
    Form searchForm = search.getSearchForm("search."+xmppConnection.getServiceName());
    Form answerForm = searchForm.createAnswerForm();  
    answerForm.setAnswer("Username", true);  
    answerForm.setAnswer("search", user);  
    ReportedData data = search.getSearchResults(answerForm,"search."+xmppConnection.getServiceName());  
    if (data.getRows() != null) 
        Iterator<Row> it = data.getRows();
        while (it.hasNext()) 
            Row row = it.next();
            Iterator iterator = row.getValues("jid");
            if (iterator.hasNext()) 
                String value = iterator.next().toString();
                System.out.println("Iteartor values...... " + value);
            
        
        return true;
    
    return false;

【讨论】:

以上是关于我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?的主要内容,如果未能解决你的问题,请参考以下文章

Arttalk XMPP 库问题

使用谷歌帐户作为 xmpp bot

XMPP Smack 4.1.0 检查用户是不是已经注册

如何了解更多 XMPP/Jabber 命令

XMPP 客户账户注册

xmpp 资源是不是更改?