我正在尝试检测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
并考虑如果连接"closed"
、"failed"
或"disconnected"
RTCPeerConnection.connectionState
永久关闭?
该规范对该主题进行了非常精心设计的建议:
建议在
iceConnectionState
转换为"failed"
时执行 ICE 重新启动。应用程序还可以选择侦听iceConnectionState
转换到"disconnected"
,然后使用其他信息源(例如使用getStats
来测量在接下来的几秒钟内发送或接收的字节数是否增加(来确定是否建议重新启动 ICE 重新启动。
查看添加此内容的规范和 PR
请注意,由于错误,Chrome 不再在统一计划中进入"失败"。 "关闭"只有在您的代码调用 pc.close(( 时才会发生,因此从 Chrome 80 开始不再在 iceconnectionstatechange 中触发。