如何通过WebRTC在两个对等方之间协商数据通道?
WebRTC RTCPeerConnection
接口有一个createDataChannel
方法和一个ondatachannel
事件处理程序。这些如何相互作用?如何创建可用于在两个对等方之间发送/接收数据的单个数据通道?如何通过WebRTC在两个对等方之间协商数据通道?
此外,RTCDataChannelInit
构造有negotiated
场,默认设置为false
,并说,这将导致通道带被公布。如果设置为true
,会发生什么情况?
首先:要创建任意数据通道,对等方需要交换一个SDP offer/answer来协商所有数据通道使用的SCTP连接的属性。这不是默认情况下发生的;在致电createOffer
之前,您必须致电createDataChannel
以提供包含此SCTP信息的要约(SDP中的“m = application”部分)。
如果你不要这样做,数据通道状态将永久停留在connecting
。
有了这样的方式,有两种方法在两个节点之间协商的数据通道:
带内协商
这是在默认情况下会发生什么,如果negotiated
场未设为true
。一个同伴呼叫createDataChannel
,另一个同ondatachannel
EventHandler
。这是如何工作的:
- 对等A呼叫
createDataChannel
。 - 正常报价/应答交换发生。
- 一旦SCTP连接启动,就会从对等点A向对等点B带内发送一条消息,告诉它有关数据通道的存在。
- 在对等B上,
ondatachannel
EventHandler
被调用一个从带内消息创建的新数据通道。它与Peer A创建的数据通道具有相同的属性,现在这些数据通道可用于双向发送数据。
该方法的优点是可以随时动态创建数据通道,而无需应用程序执行其他信号。
出带外协商
的数据信道也可以协商出的带外。采用这种方法,应用程序不是在一边调用createDataChannel
,而是在另一边调用ondatachannel
,而是在两边调用createDataChannel
。
- 同伴A调用
createDataChannel({negotiated: true, id: 0})
- 对等体B也要求
createDataChannel({negotiated: true, id: 0})
。 - 正常报价/应答交换发生。
- 一旦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