Javascript 为什么调用`RTPeerConnection.close()`不发送`closed`事件?

Javascript 为什么调用`RTPeerConnection.close()`不发送`closed`事件?,javascript,webrtc,Javascript,Webrtc,在本地连接上调用rtpeerconnection.close()时,我希望远程连接接收到closedconnectionstatechange事件 相反,几秒钟后出现了一个断开连接的(接着是一个失败的)连接状态更改,这表明我没有正确关闭连接 是否需要任何其他步骤来关闭RTPeerConnection(例如,是否需要删除任何磁道?)。我希望发送关闭而不是失败事件是否正确?如果这种情况发生的时间早于几秒钟?这是意料之中的。当关闭RTPeerConnection将生成DTLS警报时,无法确保该警报实际

在本地连接上调用
rtpeerconnection.close()
时,我希望远程连接接收到
closed
connectionstatechange
事件

相反,几秒钟后出现了一个
断开连接的
(接着是一个
失败的
连接状态更改
,这表明我没有正确关闭连接


是否需要任何其他步骤来关闭
RTPeerConnection
(例如,是否需要删除任何磁道?)。我希望发送
关闭
而不是
失败
事件是否正确?如果这种情况发生的时间早于几秒钟?

这是意料之中的。当关闭RTPeerConnection将生成DTLS警报时,无法确保该警报实际到达远程端,因为它是通过UDP发送的


这里常见的解决方案是通过您的信令协议发送一条可靠消息,表明您正在接近另一端,而另一端也将关闭连接。

检测另一个对等方关闭连接的最佳方法是始终与您的连接协商SCTP数据通道,并侦听数据通道的事件:

const pc1=new RTCPeerConnection(),pc2=new RTCPeerConnection();
const dc1=pc1.createDataChannel(“”);
dc1.onopen=()=>console.log(“打开”);
dc1.onclose=()=>console.log(“远程关闭”);
button.onclick=()=>pc2.close();
pc1.onnegotiationneeded=async()=>{
wait pc1.setLocalDescription(wait pc1.createOffer());
等待pc2.setRemoteDescription(pc1.localDescription);
wait pc2.setLocalDescription(wait pc2.createAnswer());
等待pc1.setRemoteDescription(pc2.localDescription);
};
pc1.onicecandidate=e=>pc2.addIceCandidate(e.candidate);
pc2.onicecandidate=e=>pc1.addIceCandidate(e.candidate);
pc2.oniceconnectionstatechange=()=>console.log(pc2.iceConnectionState);
pc2.ondatachannel=e=>window.keepalive=e.channel;//Firefox GC解决方案

Close remote
我想您可以使用信令服务器,但我不太确定。另外,请您澄清关于关闭浏览器选项卡的最后一点?你是说
dc.close()
?不管是哪种方式,当远程用户关闭浏览器时,我在数据通道和对等连接(Chrome)上收到一个错误。@Crossy你在我包含的小提琴上收到一个错误吗?你有什么错误?在所有4种主要浏览器中都适用。我不认为我可以使用您的示例测试关闭浏览器选项卡(这正是我所指的)。关闭浏览器选项卡似乎与
dc.close()
@Crossy的行为不同,我已经更新了答案。不,我指的是对等连接本身上的
pc.close()
,这是隐式的。感谢您的演示-它的工作原理与您描述的完全一样!我想知道为什么它对我不起作用——我得调查一下。非常感谢你的帮助。