2017-05-04 39 views

回答

7

首先:要创建任意数据通道,对等方需要交换一个SDP offer/answer来协商所有数据通道使用的SCTP连接的属性。这不是默认情况下发生的;在致电createOffer之前,您必须致电createDataChannel以提供包含此SCTP信息的要约(SDP中的“m = application”部分)。

如果你不要这样做,数据通道状态将永久停留在connecting

有了这样的方式,有两种方法在两个节点之间协商的数据通道:

带内协商

这是在默认情况下会发生什么,如果negotiated场未设为true。一个同伴呼叫createDataChannel,另一个同ondatachannelEventHandler。这是如何工作的:

  1. 对等A呼叫createDataChannel
  2. 正常报价/应答交换发生。
  3. 一旦SCTP连接启动,就会从对等点A向对等点B带内发送一条消息,告诉它有关数据通道的存在。
  4. 在对等B上,ondatachannelEventHandler被调用一个从带内消息创建的新数据通道。它与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相匹配,这是底层的SCTP流ID。

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

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

请注意,您选择的ID不只是一个任意值。它表示基于0的SCTP流ID。并且这些ID只能达到WebRTC实施协商的SCTP流的数量。所以,如果您使用的ID太高,您的数据通道将无法工作。

本地应用程序怎么样?

如果您使用的是native webrtc library而不是JS API,则它的工作方式相同;事情只是有不同的名字。

C++:

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

爪哇:

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

的OBJ-C:

  • RTCPeerConnectionDelegate::didOpenDataChannel
  • RTCDataChannelConfiguration::isNegotiated
  • RTCDataChannelConfiguration::channelId
相关问题