2011-09-01 24 views
3

XMPP允許用戶同時連接到多個客戶端的服務器,使用相同的帳戶。我構建了一個應用程序,但是如果桌面客戶端已啓用,我不希望用戶能夠使用移動客戶端進行連接。這是針對遊戲並與兩個原因問題相關聯的。檢測使用相同的帳戶的其他客戶端在XMPP

所以,我想知道的是: 是否可以檢測是否有其他客戶端使用相同的帳戶連接。如果我可以檢查其他客戶端,我可以自動註銷用戶。

回答

1

@Flow是在正確的軌道上。如果所有客戶端實例都使用相同的資源,則在大多數服務器中,後續連接的客戶端將替換舊的會話。較舊的會話將得到一個conflict流錯誤,並斷開連接。您必須小心,不要與舊客戶端自動重新連接,否則您將編寫「決鬥資源」錯誤。

如果您控制了服務器,則有可能將其配置爲允許給定用戶最多使用一個資源,在這種情況下,較新的連接將失敗並出現衝突錯誤,但您將會更糟用戶界面問題,如果你沿着這條路走下去;即使您想要,也無法讓第二個客戶端登錄。

最後,對於一個給定用戶的所有資源都訂閱了該用戶的存在。只要你的客戶端發送的存在:

<presence/> 

您將收到來自其他每個設備的存在:

<presence to='[email protected]/resource1' from='[email protected]/resource2'/> 
<presence to='[email protected]/resource1' from='[email protected]/resource3'/> 
<presence to='[email protected]/resource1' from='[email protected]/resource4'/> 

您可以使用它來決定哪些客戶端是最新的,也許是通過添加擴展到像XEP-0115那樣的存在。

0

這將是服務器的責任:從沒有接受客戶拒絕登錄。我不知道服務器是否能夠將xmpp客戶端列入黑名單,但如果您使用openfire,則應該能夠編寫擴展名。

+0

不幸的是,我沒有控制服務器。我沒有可以發送到服務器的命令來獲取使用「我的」用戶名登錄的客戶列表? – robisaks

+1

我看到的唯一機會是,當你在遊戲服務器(?)接收到用戶的消息時,完整的jabber id可能會告訴你客戶端,所以遊戲服務器可能會阻止該用戶...雖然它不聲音最佳... –

1

給桌面和移動客戶端一個固定但不同的resource string。如果移動客戶端登錄,它可以通過查看桌面客戶端資源的存在/可用性來檢測桌面客戶端的存在,反之亦然。

然後你只需要實現,告訴衝突的資源註銷的定製XMPP ad-hoc command (XEP-0050)