问题标签 [rtcdatachannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
34 浏览

javascript - WebRTC 数据通道不适用于多连接

我用数据通道编写了一个 webRTC 连接脚本。我只想为我的应用程序使用数据通道。当我一对一连接时,这工作正常。如果我使用多个连接,则不会创建数据通道。

例如:假设User AUser BUser C已连接到应用程序。连接时数据通道工作正常User A -> User B。在此连接之后,如果我尝试过,User A -> User C则数据通道不会在User C侧面打开。这是我目前面临的问题。

这是用于 webRTC 连接和数据通道创建的代码。

数据通道回调是

创建数据通道的函数

创建报价

为报价创建答案

设置 ICE 候选和答案

通过以下方式向对等用户提供要约的步骤

用户

  1. 创建 RTC 对等连接对象peerConnection
  2. creating_data_channel()通过调用函数创建数据通道
  3. create_offer_to_user()通过调用函数创建报价

对等用户

  1. 收到 offer 请求后,peer 将通过create_answer_for_user()函数创建答案。

每次与对等方连接后,我都会按dataChannel.close()方法关闭数据通道。

在双方 ICE 和 Answer 将通过update_ice_candidate()received_answer_from_user()功能完成

这可以按预期进行User A -> User B连接。我可以在用户 A 和用户 B 中看到浏览器控制台日志消息dataChannel.OnOpen(我对用户和对等方都使用 Firefox。)但是当我连接时,我只能在用户 AUser A -> User C中看到控制台日志消息。不在用户 C 中。dataChannel.OnOpen

最初我收到了一些与 ICE 相关的其他错误。那是

我已经iceRestart在报价中修复了这些错误。

在此修复后,我看不到该错误,但现在数据通道未在另一侧打开。

现在我怀疑 ICE 候选人流程。代码有问题吗?为什么这适用于user A->B而不适用于user A->C?请问有什么建议吗?

0 投票
0 回答
68 浏览

javascript - 使用 DataChannel 时 WebRTC ICE 失败

我正在构建一个需要对等 2 对等通用数据进行通信的应用程序,而 webRTC 似乎是一种不错的方法。但是,当尝试与 DataChannel 建立 p2p 连接时,我不断遇到特定网络上的 ICE Candidate 失败。但在同一个网络上,MediaChannel p2p 连接工作正常。

即使在以下 repo 的最小改编中, https://github.com/fireship-io/webrtc-firebase-demo,datachannel变体也不起作用。

怀疑它与 TCP 而不是 UDP 有关,但不允许 tcp 候选者并不能解决问题。

DataChannel 不起作用但 MediaChannel 起作用的原因是什么?该网络是大学公共网络。我们使用 firebase 作为信号服务器。谷歌 STUN 服务器。

HTML 由 callButton 组成,它将 ICECandidates + offer 推送到信令服务器,并生成一个 ID,该 ID 可用于通过 answerButton 从不同的实例进行连接。

处理大部分 webRTC 连接的 js 片段,其中pc是 RTCPeerConnection 实例:

DataChannel 不起作用但 MediaChannel 起作用的原因是什么?

0 投票
0 回答
52 浏览

webrtc - 是否可以仅在对等调用 CreateAnswer 时调用 CreateDatachannel?

我正在编写一个使用 webrtc nativeapi 与浏览器通信的程序,浏览器发起一个提议,我的程序回答它。

在我的需要中,浏览器端不发送任何流,我不希望浏览器端调用 CreateDataChannel函数,它只提供一个报价,然后等待,等待我的程序中只有一个数据通道。

问题是:在我的程序中,当接收到报价消息时,它首先调用 CreateDatachannel,然后处理报价消息,调用 SetRemoteDescription 和 CreateAnswer。这不起作用,我的数据通道没有成功建立,数据通道的状态保持在状态。在connecting浏览器端,ondatachannel 事件从未调用过。

那么,CreateDatachannel 是否只能在 CreateOffer 端调用?

编辑:这是我创建的程序的报价:

PS:如果浏览器端调用 CreateDatachannel 创建一个虚拟数据通道,一切正常,浏览器 ondatachannel 事件被触发,它可以从我的程序接收消息。

代码非常简单。我的程序,创建对等连接和数据通道:

工艺报价:

浏览器端:

0 投票
1 回答
109 浏览

node.js - 使用 DataChannel 的 NodeJS WebRTC 应用程序在生产服务器中不起作用

我使用 NodeJS 和 WebRTC 创建了一个简单的点对点应用程序,用于一对多直播应用程序。

到目前为止,它正在我的本地主机上运行,​​但是当我将应用程序部署在 Google Cloud Platform 上的生产 VM 服务器上时,我无法使用peer.createDataChannel(). 或者至少这是我看到的问题,因为它没有抛出任何错误。

服务器.js

流光.js

在我的本地主机上,当主机 ( streamer.js) 启动流媒体时,服务器Host: Data Channel Opened在控制台和主机的浏览器上输出,我看到了带有消息的 toast Server: Peer-to-peer data channel has been created.。但是,当我在生产服务器上尝试应用程序时,服务器不会在控制台上记录该应用程序,并且主机的浏览器也不会打开 toast 并显示数据通道已创建的消息。

浏览器控制台和服务器控制台都没有错误,所以我真的不知道问题出在哪里。

0 投票
2 回答
65 浏览

webrtc - 清除 WebRTC 数据通道队列

我一直在尝试将 WebRTC 数据通道用于游戏,但是,在玩 50-70 秒后,我无法在不达到队列大小限制 (8KB) 的情况下持续发送实时玩家数据。

因为数据需要是实时的,我对乱序的数据没有用处。我已经使用以下属性初始化了数据通道:

MDN 文档说缓冲区不能以任何方式更改。

无论如何我可以在不超过缓冲区空间的情况下持续发送数据吗?我不介意清除缓冲区空间,因为它只包含随时间阻塞的数据。

注意:数据一直在传输,直到缓冲区大小超过 8KB 空间。

编辑:我忘了补充一点,这个问题只有在双方位于不同的网络上时才会发生。当两者都在同一个局域网内时,没有缓冲(我想是因为带宽更高)。我尝试添加多个数据通道(8 个并行)。然而,这只增加了故障再次发生之前的时间。所有 8 个缓冲区都已满。我还尝试在每次缓冲区接近满时创建一个新通道,并在关闭前一个已满的 DC 时切换到新的 DC,但我发现缓冲区空间是困难的方式(阅读MDN Docs中的注释)不会立即释放,而是尝试传输缓冲区中的所有数据,从而占用宝贵的带宽。

提前致谢。