2

我试图检测 RTCPeerConnection 的另一端何时断开连接。目前我正在使用我的 RTCPeerConnection 对象执行以下操作:

rtcPeerConnection.oniceconnectionstatechange = () => {
        const state = rtcPeerConnection.iceConnectionState;

        if (state === "failed" || state === "closed") {
            // connection to the peer is lost and unsalvageable, run cleanup code
        } else if (state === "disconnected") {
            // do nothing in the "disconnected" state as it appears to be a transient 
            // state that can easily return to "connected" - I've seen this with Firefox
        }
    };

这似乎在我非常简单的网络条件下进行的有限测试中有效,但MDN的以下内容让我停下来,它可能不会在生产中保持不变:

当然,“断开”和“关闭”不一定表示错误;这些可能是正常 ICE 协商的结果,因此请务必妥善处理(如果有的话)。

如果是,我应该使用RTCPeerConnection.onconnectionstatechange并考虑永久关闭连接吗?RTCPeerConnection.connectionState"closed""failed""disconnected"

4

1 回答 1

5

该规范针对该主题提供了非常精心设计的建议:

iceConnectionState当转换到时,建议执行 ICE 重启"failed"。应用程序还可以选择侦听iceConnectionState转换到"disconnected"然后使用其他信息源(例如getStats用于测量在接下来的几秒钟内发送或接收的字节数是否增加)来确定是否建议重新启动 ICE。

请参阅添加此内容的规范和PR

请注意,由于错误,Chrome 在统一计划中不再“失败”。“关闭”只有在您的代码调用 pc.close() 时才会发生,因此从 Chrome 80 开始不再在 iceconnectionstatechange 中触发。

于 2020-02-14T19:37:38.037 回答