音视频通话 2.0
Android

房间连接状态管理

更新时间: 2023/05/17 10:52:47

在用户进行音视频通话或互动直播时,可能会遇到网络连接状态不稳定或者断线的情况,从而影响房间连接状态和正常的音视频业务。NERTC SDK 提供房间连接状态回调且支持断线自动重连,您可以通过监听相关回调及根据断线重连策略管理用户在房间内的连接状态,以提升 APP 用户的使用体验。

本文为您介绍 SDK 如何判断用户在通话房间内的连接状态和各个连接状态之间的转化过程。

监听房间连接状态

自 V3.8.0 起,NERTC SDK 提供 onConnectionStateChanged 回调,您可以通过注册监听此回调实时监控并管理用户在房间内的连接状态,当用户连接状态发生改变时,SDK 会触发该回调,并在回调中明确当前的房间连接状态和引起当前房间连接状态发生改变的原因。若因为网络环境状态不佳导致房间连接中断,SDK 内部会自动进行断线重连。

此外,您也通过调用 getConnectionState 方法主动获取当前房间连接状态。

房间连接状态转化流程

房间连接状态.png

房间连接状态互相转化时,您可以通过 reason 判断各种情况并处理相应的逻辑,具体如何处理请参考示例代码,其中对各房间连接状态的说明如下表所示。

房间连接状态(state)
含义
触发转化为该状态的事件

CONNECTION_STATE_DISCONNECTED = 1

尚未加入房间。

  • 调用 init 方法之后,此时会进入该状态,但还尚未调用 joinChannel 方法加入房间。
  • 调用 leaveChannel 方法离开房间。
CONNECTION_STATE_CONNECTING = 2 正在加入房间。 调用 joinChannel 方法加入房间,此时会先进入该状态,开始建立房间连接。
CONNECTION_STATE_CONNECTED = 3 加入房间成功。 调用 joinChannel 方法加入房间成功。
CONNECTION_STATE_RECONNECTING = 4 正在尝试重新加入房间。 当因为网络质量不佳导致房间连接临时中断并进行重连。
CONNECTION_STATE_FAILED = 5 加入房间失败。 当 SDK 尝试重连 30s ~ 50s 后仍失败,不再尝试重连。

示例代码

您可以参考以下代码处理常见业务事件。

NERtcCallback neRtcCallback = new NERtcCallbackEx() {
    @Override
    public void onConnectionStateChanged(int state, int reason) {
            switch (reason) {
            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_LEAVE_CHANNEL:
                // 离开房间 ,通话已经结束了。建议优先关注 onLeaveChannel 回调
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_CHANNEL_CLOSED:
                // 房间被关闭,通话已经结束了。建议优先关注onDisconnect 回调(code为NERtcConstants.ErrorCode.ENGINE_ERROR_ROOM_CLOSED)
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_SERVER_KICKED:
                // 被踢出房间,通话已经结束了。建议优先关注onDisconnect 回调(code为NERtcConstants.ErrorCode.ENGINE_ERROR_SERVER_KICKED)
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_TIME_OUT:
                // 网络超时,通话已经结束了。或关注onDisconnect 回调即可(其他code)
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_JOIN_CHANNEL:
                //开始加入房间
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_JOIN_SUCCEED:
                //加入房间成功,与服务器成功建立连接。建议优先关注 onJoinChannel 回调即可
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_REJOIN_SUCCEED:
                // 重连成功,指在网络变化或超时后的重连成功通知
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_MEDIA_CONNECTION_DISCONNECTED:
                // 网络超时,指与媒体服务器暂时失去连接,后续SDK 内部会自动重连
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_SIGNAL_DISCONNECTED:
                // 网络超时,指与信令服务器暂时失去连接,后续SDK 内部会自动重连
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_REQUEST_CHANNEL_FAILED:
                //加入房间获取房间信息这一步就失败。建议优先关注 onJoinChannel 回调即可
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_JOIN_CHANNEL_FAILED:
                //加入房间时与服务器建立长连失败。建议优先关注 onJoinChannel 回调即可
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_RE_DISPATCH:
                // 由于网络变化,分配更合适的服务器节点进行重新连接
                break;

            case NERtcConstants.ConnectionStateChangeReason.CONNECTION_CHANGED_SETTING_PROXY_SERVER:
                //在设置云代理后,开始进行云代理连接
                break;
        }
    }
}

断线重连

用户成功加入房间后,若因网络环境不佳等原因导致与房间断开连接,SDK 内部会自动进行断线重连。

为了更好地展示断线重连机制,以用户 A 和用户 B 已成功加入同一个房间后,用户 A 的网络连接异常导致房间连接状态变化为例,具体描述如下图所示。

断线重连-android.png

此文档是否对你有帮助?
有帮助
去反馈
  • 监听房间连接状态
  • 房间连接状态转化流程
  • 示例代码
  • 断线重连