XMPP允许用户使用同一帐户同时从多个客户端连接到服务器。我构建了一个执行此操作的应用程序,但如果启用了桌面客户端,我不希望用户能够使用移动客户端进行连接。这适用于游戏并且与两者相关联会导致问题。
所以我想知道的是: 是否可以检测是否有其他客户端使用同一帐户连接。如果我可以检查其他客户端,我可以自动注销用户。
答案 0 :(得分:1)
为桌面和移动客户端提供已修复但不同 resource string。如果移动客户端登录,则可以通过查找桌面客户端资源的存在/可用性来检测桌面客户端的存在,反之亦然。
然后,您只需要实现一个自定义XMPP ad-hoc command (XEP-0050),告诉冲突的资源注销。
答案 1 :(得分:1)
@Flow走在正确的轨道上。如果所有客户端实例都使用相同的资源,则在大多数服务器中,后续连接的客户端将替换旧的会话。较旧的会话将收到conflict流错误,并将断开连接。您必须小心不要自动重新连接旧客户端,否则您将编写“决斗资源”错误。
如果您可以控制服务器,则可以将其配置为允许给定用户最多一个资源,在这种情况下,较新的连接将因冲突错误而失败,但您的用户会更糟如果你沿着那条道路前进,那么界面问题即使您愿意,也无法让第二个客户端登录。
最后,给定用户的所有资源都订阅了该用户的存在。只要您的客户在以下位置发送状态:
<presence/>
您将收到其他所有设备的状态:
<presence to='user@example.com/resource1' from='user@example.com/resource2'/>
<presence to='user@example.com/resource1' from='user@example.com/resource3'/>
<presence to='user@example.com/resource1' from='user@example.com/resource4'/>
您可以使用它来决定哪个客户端是最新的,也许可以通过为XEP-0115这样的状态添加扩展名。
答案 2 :(得分:0)
服务器负责:拒绝来自未被接受的客户端的登录。我不知道服务器是否能够将xmpp客户端列入黑名单,但是如果你使用openfire,你应该可以写一个扩展名。