2

当我创建一个new RTCPeerConnection()时,我无法用 peer.close() 销毁它,据我所知,一段时间后我的资源用完了。当网页创建大量RTCPeerConnections 时,大约 600 次尝试后停止工作,并在 Chrome 中抛出以下错误:

未捕获的 DOMException:无法构造“RTCPeerConnection”:无法创建这么多 PeerConnections

这是一个测试脚本,它将帮助您解决错误。这只是说明性的,即使对等点的创建速度要慢得多,也会出现问题:

var i = 1;

function peer() {
  var peer = new RTCPeerConnection();
  setTimeout(() => {
    peer.close();
    peer=null;
  }, 10);
  console.log(i++);
}

setInterval(peer, 20);
// run the script and wait on console to see the error

我希望它在调用 peer.close() 时释放所有资源,或者至少在 peer 设置为 null 时释放所有资源,所以我看不出浏览器为什么会抛出有这么多 PeerConnections 的错误。我做错了什么吗?如何正确销毁对等体?谢谢

4

2 回答 2

0

尝试将 peer 设置为 null,以便收集垃圾。请参阅实施限制的人的这些说明。如果这不起作用,请在该邮件列表线程中询问

于 2018-08-28T16:16:11.680 回答
-1

好的,这是一个令人困惑的谜团,幸运的是它已经解决了,我会试着给你一个例子,这样任何读过这篇文章的人都可以理解到底发生了什么。

假设您已经构建了自己的程序,该程序可以计算单个文件夹中的文件,并且您命令该程序计算文件夹 C:\Files 中的文件

该文件夹路径包含 500 个文件。该程序最多需要 1 小时来读取 500 个文件,这是他的最大能力,所以你给他命令并按 Enter 键。

一小时后,你回来你看到程序是(死机),你调查什么问题?然后你会发现,由于他每小时读取500个文件的最大能力和有500个文件的文件夹,他不可能出错,但出现错误是因为有人不断在这个文件夹上扔文件,就像无限循环一样,它的就像他需要 1 秒钟来读取一个文件,并且在同一秒钟内,还有 5 个文件以累积的方式出现,他开始计数,同时新文件被累积计数。

这正是您的情况所发生的事情,chrome 浏览器在一秒钟内关闭了对等连接,而在这一秒内,您向他扔了 3-4 个新的对等连接,这使得 chrome 浏览器在控制台上标记错误之后,因为控制台后台的计算表明这是无穷大的,它迟早会显示堆栈错误。其中一部分是您通过使用这些值设置间隔时间来淹没浏览器缓存。

我一直在追踪这将近三个小时,这就是我最终得到的结果。我将很快编辑这篇文章并添加有关如何解决它的解决方案。

好的,我刚刚完成了代码的调整,下面是我运行 snip 代码的结果,如果您在 chrome 控制台注释上看到错误,请告诉我:您可以删除 sip java-script,我用它来跟踪您的错误。

希望我的帖子将来对某人有所帮助。

祝你好运

 <script src="http://sipjs.com/download/sip-0.7.2.min.js"></script>

 <meta http-equiv="Expires" content="0">
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Cache-control" content="no-cache">
 <meta http-equiv="Cache" content="no-cache">
 <script>



  var i = 1;

  function peer() {

  var peer = new RTCPeerConnection();
   
  peer.mediaHandler = null;
  peer.onicecandidate = null; 
  peer.onaddstream = null; 

  peer.close(i);

  setTimeout(() => {

  console.log('Ending Call');

  }, 3500);
  console.log(i++);



  }

 setInterval(peer, 500);


  hangUp = () => {
    let { peer} = this.state;
 
    peer.close();

 
    this.setState({
        peer: null,
      
   
    });
};




</script>

于 2018-08-28T19:20:46.500 回答