从 XMPP 注销客户端
Posted
技术标签:
【中文标题】从 XMPP 注销客户端【英文标题】:Logout clients from XMPP 【发布时间】:2012-01-17 11:13:47 【问题描述】:我有一个 xmpp/ejabberdb 应用程序,它使用外部服务来提供事件功能,但是当此服务不可用时,我想断开/注销我的所有客户端。这可能吗?怎么样?
【问题讨论】:
【参考方案1】:我让它按照我需要的方式工作。事实上,在某种情况下,我没有找到任何简单的方法让我自己的服务器注销所有连接的用户,所以我研究了 ejabberd 的代码并自己想出了一个方法。
在 ejabberd_c2s.erl 模块中,当客户端注销或它的套接字由于某种原因被丢弃时,FSM 将终止,进行所有必要的清理以保持 ejabberd 的一致性。
我所要做的就是在这个模块中创建一个导出函数 shutdown/1,它调用 gen_fsm:send_all_state_event/2 发送一个信号让它终止。 至于每个连接有一个c2s进程,我需要为每个用户调用这个函数。
---更新中--- 实际上没有必要创建这个关闭函数,因为 ejabber_c2s 已经具有处理“关闭”信号的能力,它做同样的事情。因此,与其创建关闭函数,不如简单地执行 ge_fsm:send_event(C2SPid, closed) 可能就足够了。 ---更新---
为了发现用户的 c2s 进程 PID,我只使用 ejabberd_sm:get_session_pid/1 或 ejabberd_sm:dirty_get_sessions_list/0(对于所有会话)。
这对我来说很好,但如果有人有更好的想法,请在此处添加。
谢谢
【讨论】:
【参考方案2】:我不知道 ejabberd 的细节,但是您可以编写一个自定义 XMPP 组件来轮询外部服务(或侦听存在事件,如果它是另一个 XMPP 组件),然后在服务不可用时注销用户。
【讨论】:
自定义 XMPP 组件正是我所拥有的,关键是,我如何注销客户端?我不是 XMPP/Ejabberd 方面的专家,所以我想知道如何以编程方式注销客户端。以上是关于从 XMPP 注销客户端的主要内容,如果未能解决你的问题,请参考以下文章
无法将用户从 iOS 客户端注册到 Ejabberd 服务器 - XMPP