高效的XMPP用户搜索

高效的XMPP用户搜索,xmpp,ejabberd,asmack,xmppframework,Xmpp,Ejabberd,Asmack,Xmppframework,我想有效地检查所有本地通讯簿联系人,如果他们有jabber帐户。用户使用移动电话号码在XMPP服务器上注册。 我目前将以下XEP-0055节发送到ejabberd服务器并评估结果 <iq type="set" id="searchByUserName" to="vjud.ecoimac1.local" from="+1222333444@ecoimac1.local"> <query xmlns="jabber:iq:search"> <x xmlns=

我想有效地检查所有本地通讯簿联系人,如果他们有jabber帐户。用户使用移动电话号码在XMPP服务器上注册。 我目前将以下XEP-0055节发送到ejabberd服务器并评估结果

<iq type="set" id="searchByUserName" to="vjud.ecoimac1.local" from="+1222333444@ecoimac1.local">
  <query xmlns="jabber:iq:search">
    <x xmlns="jabber:x:data" type="submit">
      <field type="hidden" var="FORM_TYPE">
        <value>jabber:iq:search</value>
      </field>
      <field var="user">
        <value>+123456789</value>
      </field>
    </x>
  </query>
</iq>

叽叽喳喳:智商:搜索
+123456789

这是可行的,但效率不高。对于每个数字,必须发送一个查询。像WhatsApp这样的其他应用程序也做同样的工作。有没有更有效的方法?

我现在有以下有效的解决方案:

在服务器端,我为eJabberd设置了一个MySQL数据库后端,在web服务器上,PHP界面为客户机应用程序提供了一个用户查询。 该应用程序发送一个HTTP POST请求,其中包含一组要检查的jabber用户名。PHP脚本查找已注册的用户,并返回包含已注册用户索引的响应

<?php

// HTTP POST sent from client app
// Do authentication here...

// Read all parameters
$users = array();
$user = $_POST["username0"];
for ($i = 1; !empty($user); $i++)
{
    // Add user
    $users[] = $user;

    // Next parameter
    $user = $_POST["username".$i];
}
if (empty($users))
{
    echo "Success"; // nothing to do
    exit;
}

// Create mySQL connection
$db = mysqli_connect("localhost", "user", "password", "database");
if (!$db)
{
    $descr = mysqli_connect_error();
    echo "Error: ".$descr;
    exit;
}

// Prepare query
// SELECT username FROM users WHERE username IN ('+41796548345','+41786547544',...)
$query = "SELECT username FROM users WHERE username IN(";
foreach ($users as $user)
{
    $query .= "'".$user."',";
}
$query = rtrim($query, ",");
$query .= ")";

// Execute query and generate result
$result = "Success";
$recset = mysqli_query($db, $query); // [+41786547544,+41763428566,...]
while ($rec = mysqli_fetch_object($recset))
{
    $index = find_user($rec->username, $users);
    if ($index >= 0)
    {
        $result .= "\t".$index;
    }
}

echo $result;

function find_user($username, $users)
{
    for ($idx = 0; $idx < count($users); $idx++)
    {
        if ($users[$idx] == $username)
        {
            return $idx; // found at index
        }
    }
    return -1; // not found
}

感谢您为搜索请求提交此精确的XML。我想让它工作起来,但我已经发疯了。简单类型的搜索(没有
)以某种方式返回错误。结果证明,对于扩展搜索,我没有发送
jabber:iq:search
子句。这对明火很有效,但对ejabberd没有效果。