如何恢复会话 - ejabberd

Posted

技术标签:

【中文标题】如何恢复会话 - ejabberd【英文标题】:How to resume session - ejabberd 【发布时间】:2017-03-16 13:03:44 【问题描述】:

对于会话恢复,我正在关注 xep-0198(XMPP 框架中的流管理)。它只能工作 300 秒。如果用户超过 300 秒没有打开聊天应用程序,即使我增加了超时间隔,连接也会自动丢失。

我对 yml 文件做了以下操作:

listen: 
  - 
    port: 5222
    module: ejabberd_c2s
    resend_on_timeout: if_offline
    stream_management: true
    resume_timeout: 10000
    max_resume_timeout: 10000

在代码中:(Swift) 登录应用程序时

xmppStreamManagement = XMPPStreamManagement(storage: XMPPStreamManagementMemoryStorage(), dispatchQueue: DispatchQueue.main)
xmppStreamManagement?.autoResume = true
xmppStreamManagement?.addDelegate(self, delegateQueue: DispatchQueue.main)
xmppStreamManagement?.activate(stream)

认证后:

xmppStreamManagement?.enable(withResumption: true, maxTimeout: 10000)

func canResumeStream() -> Bool
        return true
    

    func xmppStreamManagement(_ sender: XMPPStreamManagement!, wasEnabled enabled: DDXMLElement!)
        print("enabled")
    

    func xmppStreamManagement(_ sender: XMPPStreamManagement!, wasNotEnabled failed: DDXMLElement!)
        print("not enabled")
    

    func supportsStreamManagement() -> Bool
        return true
    

我从服务器得到以下结果:

<enabled xmlns="urn:xmpp:sm:3" resume="true" max="10000" id="g2gCbQAAABY1NzQ5MzQwOTgwNjk2OTY4NTcxMjE4aANiAAAF0WIACjagYRg="/>

但如果我让用户闲置超过 5 分钟,会话就会过期。谁能帮我解决这个问题?

【问题讨论】:

您必须在服务器端启用 mod_ping 或每隔一段时间 ping 到服务器,否则 TCP/IP 连接将关闭。 【参考方案1】:

您可以使用 XMPPPingModule (XEP-0199: XMPP Ping) 来保持会话处于活动状态。

例子:

let  xmppPing = XMPPPing()
xmppPing?.respondsToQueries = true
xmppPing?.activate(stream)

let xmppAutoPing = XMPPAutoPing()
xmppAutoPing?.pingInterval = (yourTimeInterval) * 60
xmppAutoPing?.pingTimeout = pingTimeOutTime
xmppAutoPing?.activate(stream)

【讨论】:

以上是关于如何恢复会话 - ejabberd的主要内容,如果未能解决你的问题,请参考以下文章

发件人应用程序在被杀死后如何恢复会话?

谷歌浏览器崩溃后恢复会话cookie,如何避免?

如何在 Android 上进行 SSL 会话恢复

如何在张量流中恢复会话? [复制]

使用 EJABBERD-BUSINESS 版本在 SMACK 中恢复流后读取“重新绑定”数据包

集群中的 Tomcat TLS 会话恢复