10

WebRTCRTCPeerConnection接口有一个createDataChannel方法和一个ondatachannel事件处理程序。这些如何相互作用?如何创建可用于在两个对等方之间发送/接收数据的单个数据通道?

此外,RTCDataChannelInit构造函数有一个negotiated字段,默认情况下设置为false并表示它导致通道在带内被宣布。如果设置为 会发生什么true

4

2 回答 2

32

首先:为了创建任何数据通道,对等点需要交换一个 SDP 提议/答案,以协商所有数据通道使用的 SCTP 连接的属性。默认情况下不会发生这种情况。您必须在要求报价createDataChannel之前致电createOffer以包含此 SCTP 信息(SDP 中的“m=application”部分)。

如果这样做,数据通道状态将永远停留在connecting.

除此之外,有两种方法可以在两个对等方之间协商数据通道:

带内协商

这是默认情况下发生的情况,如果该negotiated字段未设置为true。一个对等方呼叫createDataChannel,另一个连接到ondatachannel EventHandler. 这是如何工作的:

  1. 同行 A 呼叫createDataChannel
  2. 发生正常的提议/答案交换。
  3. 一旦 SCTP 连接建立,一条消息就会从对等点 A 带内发送到对等点 B,告诉它数据通道的存在。
  4. 在对等体 B 上,ondatachannel EventHandler使用从带内消息创建的新数据通道调用。它与 Peer A 创建的数据通道具有相同的属性,现在这些数据通道可以用于双向发送数据。

这种方法的优点是可以随时动态创建数据通道,而无需应用程序执行额外的信令。

带外协商

数据通道也可以在带外协商。使用这种方法,应用程序无需在一侧调用并createDataChannel在另一侧进行侦听,而是在两侧ondatachannel调用。createDataChannel

  1. 对等 A 呼叫createDataChannel({negotiated: true, id: 0})
  2. 对等 B 也调用createDataChannel({negotiated: true, id: 0})
  3. 发生正常的提议/答案交换。
  4. 一旦 SCTP 连接建立,通道将立即可用(readyState将变为open)。它们由 ID 匹配,该 ID 是底层 SCTP 流 ID。

这种方法的优点是,由于不需要在带内发送消息来在对等 B 上创建数据通道,因此该通道可以更快地使用。这也使应用程序代码更简单,因为您甚至不需要为ondatachannel.

因此,对于只使用固定数量的数据通道的应用程序,建议使用这种方法

请注意,您选择的 ID 不仅仅是一个任意值。它表示底层的基于 0 的 SCTP 流 ID。并且这些 ID 只能与 WebRTC 实现协商的 SCTP 流的数量一样高。因此,如果您使用的 ID 太高,您的数据通道将无法正常工作。

原生应用程序呢?

如果您使用本机 webrtc 库而不是 JS API,它的工作方式相同;事物只是有不同的名称。

C++:

  • PeerConnectionObserver::OnDataChannel
  • DataChannelInit::negotiated
  • DataChannelInit::id

爪哇:

  • PeerConnection.Observer.onDataChannel
  • DataChannel.Init.negotiated
  • DataChannel.Init.id

对象-C:

  • RTCPeerConnectionDelegate::didOpenDataChannel
  • RTCDataChannelConfiguration::isNegotiated
  • RTCDataChannelConfiguration::channelId
于 2017-05-04T17:04:43.677 回答