如何从客户端知道XMPP服务器上是否存在一个帐户?

3

我正在使用Smack库开发一个即时通讯应用程序,遇到了一些问题。

我想知道是否有可能通过用户名在服务器上检查用户的存在。我的应用程序需要检查系统联系人列表中的人是否在我的服务器上开设了账户,以及他们是否不在他们的朋友列表中。

到目前为止,我已经成功将系统联系人列表中的每个联系人添加到我的用户的服务器联系人列表中 - 即使他们之前没有账户 - 但这并不是我要寻找的。

以下是代码(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作为服务器。
2个回答

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

请注意,这种方法的限制是它只能用于授权会话。因此,如果您尝试实现自注册并进行身份验证检查(例如,ID 可用性检查),则需要另一种方法。 - ılǝ

0
您可以尝试以下代码片段来搜索用户:
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接