频道连接状态管理

通过阅读本文,可以了解各种频道连接状态,状态改变原因和应该采取的处理方式。

功能介绍

在实时音视频场景中,客户端与服务端之间的连接状态会随着用户加入或离开频道而发生变化,同时也可能因用户网络问题导致重新连接或断开。因此,对频道连接状态进行有效管理至关重要,这不仅直接影响用户的实时音视频体验,还涉及整个应用的稳定性与可靠性。

功能原理

连接状态

当连接状态发生变化时,ARTC SDK会触发onConnectionStatusChange回调。下图展示了各种连接状态,以及用户在加入和离开频道过程中连接状态的变化。

image

断线重连

通话过程中,如果因网络问题导致连接断开,SDK 会自动重连。下图展示用户A(User A)和用户B(User B)在以下过程中收到的回调:假设UserB已在频道中,User A加入频道、发生网络异常自动重连、重连失败。

image
  • T0时:User A发起 joinChannel 请求.

  • T1时:User A加入频道成功,收到 onJoinChannelResult(result=0) onConnectionStatusChange的回调。

  • T2时:User B感知User A加入房间,收到 onRemoteUserOnLineNotify 回调。

  • T3时:User A因为客户端断网等原因导致连接断开。

  • T4时:User A SDK检测到网络断开或者一段时间内收不到服务端发送的任何数据,会发起自动重连,同时User A收到 onConnectionStatusChange的回调。

  • T5时:SDK100秒内多次重试依然无法重新加入频道,不再继续尝试,向User A回调onConnectionStatusChange。此时用户需要退出当前频道,检查本地网络后,网络恢复正常后重新加入频道。

代码示例

Android

onConnectionStatusChange - 网络连接状态改变回调

@Override
public void onConnectionStatusChange(AliRtcEngine.AliRtcConnectionStatus status, AliRtcEngine.AliRtcConnectionStatusChangeReason reason) {
    super.onConnectionStatusChange(status, reason);
    Log.e(TAG, "onConnectionStatusChange.");
    ThreadUtils.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (mLogView != null) {
                mLogView.logI("网络连接变化为:" + status + ",原因为:" + reason);
            }
        }
    });
}

iOS

onConnectionStatusChange - 网络连接状态改变的回调

/**
 * @brief 频道连接状态改变的回调
 * @param status 当前状态值, 对应值参考枚举AliRtcConnectionStatus
 * @param reason 引起状态变化的具体原因, 对应值参考枚举AliRtcConnectionStatusChangeReason
*/
- (void)onConnectionStatusChange:(AliRtcConnectionStatus)status reason:(AliRtcConnectionStatusChangeReason)reason{
    NSString *stateStr = [NSString stringWithFormat:@"\n网络状态:%@ status: %ld  原因:%@ reason:%ld\n",[self callbackNetstatus:status], (long)status,[self callbackNetstatusReason:reason], (long)reason];
    MyLog(@"%@", stateStr);
}

Windows

OnConnectionStatusChange - 网络连接状态改变的回调

void AliSDKEventListener::OnConnectionStatusChange(int status, int reason)
{
    if (win_rtc_listener_)
    {
        win_rtc_listener_->OnConnectionStatusChange(status, reason);
    }
}

状态说明

连接状态

连接状态

描述

Init

初始状态,发生在调用joinChannel之前。

Connecting

调用 joinChannel方法后的瞬时状态。

Connected

发生在 App 成功加入频道后。

SDK 还会触发 onJoinChannelResult回调,上报本地客户端已经加入频道。 此时SDK会自动发布或订阅频道中的音频和视频,用户也可以手动控制发布和订阅。

Disconnected

发生在调用 leaveChannel 之后。

Reconnecting

发生在连接中断时。SDK 会在中断后自动尝试重新连接。

如果重新加入频道成功,SDK 会触发 onConnectionStatusChange

(AliRtcConnectionStatusConnected,AliRtcConnectionChangedSignalingJoinChannelSuccess)

Failed

连接失败。发生在 SDK 在 100秒内无法加入频道、并且 SDK 停止重新连接频道时。 此时用户需要调用leaveChannel,检查本地网络后,网络恢复正常后再调用joinChannel

状态原因说明

连接状态(status)

状态原因说明(reason)

Init

无原因,初始状态。

Connecting

Connecting:加入频道中。

Connected

JoinChannelSuccess:成功加入频道。

Disconnected

LeaveRoom:用户主动离开频道。

Reconnecting

  • HeartbeatTimeout:一段时间内收不到服务端任何数据。可能是网络下行不通、网络丢包过高等原因。

  • NetworkInterrupted:客户端网络断开。

Failed

JoinChannelFailure:加入房间失败或重新加入房间失败。可能是网络断开一直没有恢复、token 无效等原因。