`
yjl49
  • 浏览: 113286 次
社区版块
存档分类
最新评论

Openfire 用户离线、断线 及心跳检测

 
阅读更多

客户端登出分为正常离线和断线,正常离线会发送presence 消息通知服务器,断线则无通知发送。

 

1. 正常离线:

客户端在离线之前发送<presence id='***' type ="unavailable"></presence>

由PresenceRouter 路由到PresenceUpdateHandler 中处理。

判断Type为unavailable 之后先进行广播,再设置session的状态,再更新presenceManager中用户最后一次的状态。

presenceManager中会更新lastActivityCache 中的离线时间(这个时间就是我们在OF控制台中 用户/组 页面中看到的“最近一次退出” 的值来源了),如果这个presence 中含有status 子项,则会同时将此条presence 记录到ofpresence 数据库表中。

 

2.断线:

如果因为网络原因导致断线,服务器端无法收到客户端口的presence消息,但MINA框架会激发sessionClosed事件,在OF的ConnectionHandler的sessionClosed() 方法中可进行后续处理。在这个方法中OF模似了客户端口离线的presence。

 

3.OF之心跳检测:

在OF服务器设置中有一项 Client Connections --> Idle Connections Policy

选择Disconnect client after they have been idle for [***] seconds

Send a XMPP Ping request to idle clients

对这两项的解释如下:

MINA框架本身提供了idle检测功能,这项功能可检测客户端口建立了TCP/IP连接、却不发送任何消息的情况。

当我们设置了第一项中的时长,OF会调用MINA的session.setIdleTime()方法,在客户端口连接经过指定时长未发送任何消息的情况下触发sessionIdle事件,由sessionIdle()方法处理。

在ClientConnectionHandler 的sessionIdle()方法中判断当前的idle次数大于1次时将关闭客户端连接。 我们设置了idle Time 之后这个idle的检测发生在达到一半时间和达到指定时间,每次检测都会将idle 的次数加1 。 也就是说我们一旦设定了这个时长,则MINA框架会在这个时长的一半时间内,客户端仍未发送消息时触发一次sessionIdle事件,然后在到达指定时长,客户端仍未发送消息时再触发一次。

Openfire 对这个ConnectionHandler 进行了再一次封装,在第一次触发sessionIdle时发送一次ping 消息,逼迫客户端进行响应。-------------这里就是我们设置第二个选项的意义所在。

使用心跳检测我们可以关闭那些长时间不活动的连接,以节约OF的资源。

分享到:
评论

相关推荐

    基于openfire的android即时通信

    2. 连接管理:客户端需要建立并维护与Openfire服务器的连接,处理断线重连,以及心跳机制保持连接状态。 3. 用户注册与登录:实现用户账号的注册和登录功能,通过XMPP协议与服务器进行交互。 4. 实时消息传输:设计...

    openfire为服务器的XMPP的即时通信样例

    - 实现XMPP连接逻辑,包括登录、心跳维持、断线重连等。 - 创建聊天界面,处理消息发送与接收,展示聊天历史。 5. **Android与Openfire通信**: - 用户注册与登录:使用Smack库连接到Openfire服务器,进行用户...

    Android-XMPP-openfire-实现IM

    - **连接管理**:客户端需要建立与Openfire服务器的连接,处理登录、心跳保活、断线重连等逻辑。 - **消息处理**:实现聊天功能,包括单聊、群聊,以及接收、发送消息的接口。 - **状态管理**:展示用户在线状态...

    Android应用源码之AdXmpp(Openfire+asmack+spark).zip

    1. **连接管理**:使用Asmack库建立与Openfire服务器的连接,包括登录、心跳保持、断线重连机制。 2. **会话管理**:创建和管理XMPP会话,包括发送和接收消息,以及处理各种XMPP stanza(消息、IQ、presence)。 3. ...

    安卓Android源码——AdXmpp(Openfire+asmack+spark).zip

    开发者通常会创建一个XMPP连接管理类,负责初始化连接、处理断线重连、心跳保持等核心任务。此外,还需要实现XMPP事件监听器,以处理各种事件,如新消息到达、用户上线/离线通知等。 为了提高用户体验,AdXmpp可能...

    基于xmpp_openfire_smack开发之smack类库介绍和使用

    在实际开发中,通常还需要处理网络连接的异常情况,如断线重连、心跳保活和离线消息存储与恢复。此外,Smack 提供了丰富的 API 来处理用户注册、账号管理和权限控制,可以方便地进行用户管理。 总之,Smack 类库为...

    MyXmpp(asmack) for Android

    合理的连接心跳机制和断线重连策略也是提高用户体验的关键。 在实际开发中,你需要阅读asmack的文档,理解其API用法,并结合Openfire的服务器配置,才能将MyXmpp项目搭建起来。同时,对Android的生命周期管理和网络...

    ios的xmppframework

    它实现了基本的登录、心跳维持、断线重连等功能。 2. **XMPPStream**:作为框架的基础,XMPPStream处理XML流的解析和生成,是所有XMPP数据传输的通道。它负责解析接收到的数据并触发相应的事件,同时将本地生成的...

    xmpp ios demo

    7. **离线消息**:处理用户离线期间的消息存储和恢复。 8. **扩展功能**:XMPP支持许多扩展,如文件传输、语音/视频通话、地理位置分享等,可以根据需求进行实现。 为了在“MyXmpp”项目中运行和调试,你需要: 1....

    Android XMPP好友列表+聊天

    6. **离线消息处理**:当用户离线时,服务器会保存发送方的离线消息。客户端重新上线后,服务器会将这些消息推送给客户端。因此,需要监听离线消息并适当地显示在聊天界面上。 7. **推送通知**:为了提高用户体验,...

    smack_3_2_0

    7. **推送通知**:Smack提供了离线消息处理和XEP-0198(Stream Management)的支持,确保消息在客户端离线时能够被正确存储并推送给用户。 8. **扩展协议支持**:Smack通过实现XEP(XMPP Extension Protocols)来...

    XMPP C Lib

    2. **会话管理**:通过Iksemel,可以建立和维护与服务器的持久连接,处理心跳保持和断线重连。 3. **实体和资源**:开发者可以创建和管理XMPP的JID(Jabber Identifier),包括用户名、域和资源名。 4. **消息发送...

    Instant Messaging in Java

    3. **会话管理**:保持连接状态,及时处理断线重连,以及用户会话的创建和关闭。 4. **联系人管理**:添加、删除和更新联系人,以及处理 Roster 变更事件。 5. **在线状态**:获取和设置用户的在线状态,包括在线...

    XMPP学习宝典

    - **连接管理**: 如断线重连、心跳保活等策略。 - **性能优化**: 例如批量发送、消息去重、存储转发等技术。 - **客户端设计**: 考虑用户体验,包括消息历史记录、消息撤回、消息送达状态等功能。 7. **XMPP与...

    smack 源码

    这些类处理了TCP连接的建立、心跳维持、SSL/TLS加密以及断线重连等机制。 2. **身份验证**:Smack支持多种身份验证方式,包括简单的明文密码(PLAIN)、SCRAM-SHA-1等。`Authenticator`类负责处理身份验证过程。 3...

    iOS 实现的即时聊天

    11. **用户体验优化**:在iOS应用中,为了提供良好的用户体验,需要考虑消息推送(APNs)、离线消息、消息回执、消息撤回等功能的实现。 在"XMPPdemo"这个项目中,开发者可能已经实现了以上所述的部分或全部功能。...

    AndroidXMPP-master

    5. **XMPP Connection Management**:建立和维护到XMPP服务器的连接是关键步骤,通常涉及TCP连接的建立、认证过程(如PLAIN、DIGEST-MD5或TLS/SSL加密)、心跳保活以及断线重连策略。 6. **Presence and Roster ...

    xmpp-hybrid-app-examples-源码.rar

    8. **性能优化**: 鉴于实时通信的特性,源码可能涉及到心跳机制、断线重连策略、资源管理和内存优化等内容,以保证良好的用户体验。 9. **API设计**: 如果源码包含自定义API,开发者可以学习到如何设计适应不同平台...

Global site tag (gtag.js) - Google Analytics