在 XMPP 中检测使用相同帐户的其他客户端
Posted
技术标签:
【中文标题】在 XMPP 中检测使用相同帐户的其他客户端【英文标题】:Detecting other clients using the same account in XMPP 【发布时间】:2011-09-01 15:16:59 【问题描述】:XMPP 允许用户使用同一个帐户同时从多个客户端连接到服务器。我构建了一个执行此操作的应用程序,但如果启用了桌面客户端,我不希望用户能够使用移动客户端进行连接。这是一个游戏,连接到两者都会导致问题。
所以我想知道的是: 是否可以检测是否有其他客户端使用同一帐户连接。如果我可以检查其他客户端,我可以自动注销用户。
【问题讨论】:
【参考方案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】:给桌面和移动客户端一个固定但不同resource string。如果移动客户端登录,它可以通过查找桌面客户端资源的存在/可用性来检测桌面客户端的存在,反之亦然。
那么你只需要实现一个自定义的XMPP ad-hoc command (XEP-0050),告诉冲突的资源退出。
【讨论】:
【参考方案3】:这将是服务器的责任:拒绝来自不被接受的客户端的登录。我不知道服务器是否能够将 xmpp 客户端列入黑名单,但如果你使用 openfire,你应该能够编写扩展。
【讨论】:
很遗憾,我无法控制服务器。没有命令可以发送到服务器以获取使用“我的”用户名登录的客户端列表? 我看到的唯一机会是,当您的游戏服务器(?)收到来自用户的消息时,完整的 jabber id 可能会告诉您客户端,因此游戏服务器可能会阻止该用户。 ..虽然听起来不是最理想的...以上是关于在 XMPP 中检测使用相同帐户的其他客户端的主要内容,如果未能解决你的问题,请参考以下文章