XMPP:使客户端仅对该客户端的其他实例在线显示

Posted

技术标签:

【中文标题】XMPP:使客户端仅对该客户端的其他实例在线显示【英文标题】:XMPP: Make client appear online only to other instances of that client 【发布时间】:2012-05-22 08:20:44 【问题描述】:

我想使用 XMPP 作为桌面应用程序的消息总线。由于该应用程序将使用用户现有的 XMPP 帐户(GTalk 等)并且不提供 IM 服务,因此我想让我的客户端实例对其他 XMPP 客户端不可见。

为此,我正在考虑使用客户端服务发现和隐私列表来阻止向我自己的其他客户端的完整 JID 发出的状态通知。然而,我确实怀疑这种方法的可扩展性和稳健性。有没有更好的方法来实现这一点?

编辑:

我现在在想,最接近这种行为的方法是设置一个负优先级的存在。这将有望最大程度地减少用户的困惑并相当普遍地工作。

【问题讨论】:

那么您可能会发现此答案的部分内容很有帮助:***.com/a/10405658/15996 【参考方案1】:

XEP-0126 没有您需要的工具,因为您无法找到您必须直接访问的其他客户...因为它们是不可见的。

如果您的所有客户都加入MUC 房间会怎么样?

【讨论】:

我稍微掩盖了一些细节——我想我可以阻止所有传出的存在,去可用,使用迪斯科查找所有不属于我的客户,然后切换到阻止存在那些特定的完整 JID(带资源),然后重新发送可用。然后更新隐私列表,因为更多的存在节来自我自己以外的客户。我认为 GTalk 不支持隐私列表,所以现在已经出局了。我将不得不考虑如何使用 MUC 代替 - 谢谢。 这是为什么呢?通过阅读规范,传出存在的初始阻止不应影响传入存在。如果存在缺少<c/>,则该完整 JID 可能已在隐私列表中被阻止。如果存在有一个<c/> 和一个<iq/> 交换客户端到客户端迪斯科请求将不会被隐私列表中被阻止的传出存在所阻碍。 除了 GTalk 不支持隐私列表之外,我能看到的唯一可能会破坏这种方法(除了笨拙之外)的是隐私列表是否会影响裸 JID 而不是完整 JID。由于它们可以在每个流的基础上激活,我认为情况并非如此 - 你能为我澄清一下吗? 如果对方是你的客户,你不会从它那里获得存在感,所以 标签对你没有帮助。 Disco#items 到你自己的裸 JID 通常不响应资源列表,并且 disco#items 到其他人的 JID 不应该返回他们的资源,因为这将是一个存在泄漏。 我说过我只会最初在切换到阻止特定完整 JID 的存在之前阻止出站存在。

以上是关于XMPP:使客户端仅对该客户端的其他实例在线显示的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google AppEngine XMPP 库查询客户端的时区

PHP:保持与 XMPP 聊天客户端的持久连接

XMPP 客户端如何从服务器检索在线用户?

使用 Openfire 服务器和 XMPP(SMACK)客户端的 Android 聊天应用程序 [关闭]

使用 XMPP 实现目标服务

无法在 Swift XMPP 客户端中导入客户端证书