WebRTC的RTCPeerConnection
接口有一个createDataChannel
方法和一个ondatachannel
事件处理程序。它们如何交互?我该如何创建一个单一的数据通道,以便在两个对等方之间发送/接收数据?
此外,RTCDataChannelInit
构造函数有一个negotiated
字段,默认设置为false
,表示通道将在带内宣布。如果将其设置为true
会发生什么?
WebRTC的RTCPeerConnection
接口有一个createDataChannel
方法和一个ondatachannel
事件处理程序。它们如何交互?我该如何创建一个单一的数据通道,以便在两个对等方之间发送/接收数据?
此外,RTCDataChannelInit
构造函数有一个negotiated
字段,默认设置为false
,表示通道将在带内宣布。如果将其设置为true
会发生什么?
createOffer
之前调用createDataChannel
,以便于offer包含此SCTP信息(SDP中的“m=application”部分)。connecting
。如果未将negotiated
字段设置为true
,则默认情况下会发生这种情况。一方调用createDataChannel
,而另一方连接到ondatachannel
EventHandler
。如何工作:
createDataChannel
。ondatachannel
EventHandler
。它具有与对等方A创建的数据通道相同的属性,现在这些数据通道可以用于双向发送数据。此方法的优点是,数据通道可以动态地在任何时候创建,而无需应用程序进行其他信令。
也可以通过带外协商来协商数据通道。使用该方法时,应用程序只需在两端调用createDataChannel
,而不是在一侧调用createDataChannel
并在另一侧侦听ondatachannel
。
createDataChannel({negotiated: true, id: 0})
createDataChannel({negotiated: true, id: 0})
readyState
将更改为open
)。它们通过ID匹配,该ID是底层的SCTP流ID。这种方法的优点是,在Peer B上不需要发送任何消息来创建数据通道,因此通道可以更快地使用。这也使应用程序代码更简单,因为您甚至不需要烦恼ondatachannel
。
因此,对于仅使用固定数量的数据通道的应用程序,建议使用此方法。
请注意,您选择的ID不仅仅是任意值。它代表底层基于0的SCTP流ID。这些ID只能高达WebRTC实现协商的SCTP流数。因此,如果您使用的ID过高,则数据通道将无法工作。
原生应用程序怎么办?
如果您使用本地WebRTC库而非JS API,则工作方式相同,只是名称不同。
C++:
PeerConnectionObserver ::OnDataChannel
DataChannelInit::negotiated
DataChannelInit::id
Java:
PeerConnection.Observer.onDataChannel
DataChannel.Init.negotiated
DataChannel.Init.id
Obj-C:
RTCPeerConnectionDelegate::didOpenDataChannel
RTCDataChannelConfiguration::isNegotiated
RTCDataChannelConfiguration::channelId