连接状态管理

最近更新时间:2021-04-01 14:58:00

本文介绍 RTM SDK 与 RTM 服务之间的连接状态以及连接状态如何在不同状态之间切换。

概述

网络连接状态指的是 RTM SDK 与 RTM 服务之间的连接状态,分别有:

连接状态说明
CONNECTION_STATE_DISCONNECTED用户未连接
CONNECTION_STATE_CONNECTING用户正在连接
CONNECTION_STATE_CONNECTED用户已连接
CONNECTION_STATE_RECONNECTING用户正在重连
CONNECTION_STATE_ABORTED用户被踢出

网络连接状态的改变可以调用 API 主动改变,RTM SDK 也会根据网络等条件自动实现部分状态切换。

当连接状态发生改变时,RTM SDK 会通过 onConnectionStateChanged 回调返回最新的连接状态 ConnectionState 的枚举值 和 状态变化的原因 ConnectionChangeReason 的枚举值。

调用 API 改变连接状态

主动调用 API 方法改变网络连接状态的有:loginlogout

1. 登录 RTM 系统

当使用 RtmClient 调用 login 登录 RTM 系统时,连接状态会从 DISCONNECTED 变为 CONNECTING,状态改变原因为 LOGIN

当处于 CONNECTING 状态时,你不需要进行任何操作,连接状态会自动转换为下列状态之一:

  • DISCONNECTED:用户登录失败或登录超时(6 秒内未登录系统)。
  • CONNECTED:用户登录成功。 当连接状态变为 DISCONNECTED 后,你需要重新调用 login 登录。

2. 登出 RTM 系统

当使用 RtmClient 调用 logout 登出 RTM 系统,连接状态会转换为 DISCONNECTED

根据条件自动改变连接状态

根据条件自动改变网络连接状态的有:断网重连和被踢出系统。

1. 断网重连

当连接处于 CONNECTED 状态时,由于网络等原因导致 RtmClient 与 RTM 系统连接断开时长超过 4 秒,连接状态会由 CONNECTED 改变为 RECONNECTING,状态改变原因为 INTERRUPTED。RTM SDK 会持续自动重新登录 RTM 系统直至登录成功,应用端无需处理,重新登录成功后,连接状态会变更为 CONNECTED

自动重连之后,RTM SDK 会把断开连接期间的消息进行补发:

  • 断开连接期间的全部点对点消息。
  • 补发重连成功之前 30 秒内的频道消息。
  • 最多补发 32 条频道消息。

处于重连状态时,根据实际业务情况可以调用 logout 登出系统再调用 login 方法重新登录 RTM 系统。

注意事项

  • 30 秒内重连成功,连接状态会变更为 CONNECTED。用户的在线状态不变。
  • 30 秒内仍然未重连成功,RTM 系统会将对应用户从在线用户列表和频道中移除,同一频道的用户会收到 MemberLeft 回调。如果用户在之后重新成功登录系统,连接状态会变更为 CONNECTED,SDK 会自动帮助对应用户加入之前加入的频道,同一频道的用户会收到 MemberJoined 回调。由于此时 RTM 系统已将用户从在线列表中移除, SDK 还会自动同步用户属性到 RTM 系统。
  • SDK 重连时,如果 Token 过期,SDK 会返回 TokenExpired 回调。但是该回调不会对连接状态产生影响。

2. 被踢出 RTM 系统

RTM 系统不支持多点登录,如果使用相同的用户 ID 登录 RTM 系统,当前登录状态的用户会被 RTM 系统踢出,连接状态变为 ABORTED

你可以调用 logout 先登出系统再根据实际业务情况调用 login 方法重新登录 RTM 系统。

ABORTED 状态下,调用publish等需要校验用户权限的 API 都会失败。

示例代码

参考以下示例代码监听连接状态:

// 监听连接状态
public void onConnectionStateChanged(int state, int reason)
{
   System.out.println("on connection state changed to "+ state + " reason: " + reason);
 }

API 参考