【发布时间】:2011-09-01 15:16:59
【问题描述】:
XMPP 允许用户使用同一个帐户同时从多个客户端连接到服务器。我构建了一个执行此操作的应用程序,但如果启用了桌面客户端,我不希望用户能够使用移动客户端进行连接。这是一个游戏,连接到两者都会导致问题。
所以我想知道的是: 是否可以检测是否有其他客户端使用同一帐户连接。如果我可以检查其他客户端,我可以自动注销用户。
【问题讨论】:
标签: xmpp
XMPP 允许用户使用同一个帐户同时从多个客户端连接到服务器。我构建了一个执行此操作的应用程序,但如果启用了桌面客户端,我不希望用户能够使用移动客户端进行连接。这是一个游戏,连接到两者都会导致问题。
所以我想知道的是: 是否可以检测是否有其他客户端使用同一帐户连接。如果我可以检查其他客户端,我可以自动注销用户。
【问题讨论】:
标签: xmpp
@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。
【讨论】:
给桌面和移动客户端一个固定但不同resource string。如果移动客户端登录,它可以通过查找桌面客户端资源的存在/可用性来检测桌面客户端的存在,反之亦然。
那么你只需要实现一个自定义的XMPP ad-hoc command (XEP-0050),告诉冲突的资源退出。
【讨论】:
这将是服务器的责任:拒绝来自不被接受的客户端的登录。我不知道服务器是否能够将 xmpp 客户端列入黑名单,但如果你使用 openfire,你应该能够编写扩展。
【讨论】: