Tay*_*ter 4 sctp webrtc rtcdatachannel
WebRTC RTCPeerConnection接口有一个createDataChannel方法和一个ondatachannel事件处理程序.这些如何互动?如何创建可用于在两个对等体之间发送/接收数据的单个数据通道?
此外,RTCDataChannelInit构造函数有一个negotiated字段,默认情况下设置为false并表示它会导致频道在带内通知.如果设置为什么会发生什么true?
Tay*_*ter 15
首先:要创建任何数据通道,对等方需要交换协商所有数据通道使用的SCTP连接属性的SDP提供/应答.默认情况下不会发生这种情况; createDataChannel在调用createOffer要约包含此SCTP信息(SDP中的"m =应用程序"部分)之前,您必须打电话.
如果不这样做,数据通道状态将永远停留在connecting.
有了这种方法,有两种方法可以在两个对等体之间协商数据通道:
带内协商
如果negotiated字段未设置为默认情况,则会发生这种情况true.一个对等体呼叫createDataChannel,另一个连接到ondatachannel EventHandler.这是如何工作的:
createDataChannel.ondatachannel EventHandler使用从带内消息创建的新数据通道调用.它具有与对等方A创建的数据通道相同的属性,现在这些数据通道可用于双向发送数据.这种方法的优点是可以随时动态创建数据通道,而无需应用程序进行额外的信令.
带外协商
数据通道也可以在带外协商.通过这种方法,应用程序只需要双方调用,而不是createDataChannel在一侧调用并在另一侧进行侦听.ondatachannelcreateDataChannel
createDataChannel({negotiated: true, id: 0})createDataChannel({negotiated: true, id: 0}).readyState将更改为open).它们与ID匹配,ID是底层SCTP流ID.这种方法的优点在于,由于不需要在带内发送消息以在对等B上创建数据信道,因此该信道可以更快地使用.这也使应用程序代码更简单,因为您甚至不需要打扰ondatachannel.
因此,对于仅使用固定数量数据通道的应用程序,建议采用此方法.
请注意,您选择的ID不仅仅是一个任意值.它表示基础的基于0的SCTP流ID.并且这些ID只能与WebRTC实现协商的SCTP流的数量一样高.因此,如果您使用的ID太高,您的数据通道将无法正常工作.
本机应用程序怎么样?
如果您使用的是本机webrtc库而不是JS API,它的工作方式相同; 事情只是有不同的名字.
C++:
PeerConnectionObserver::OnDataChannelDataChannelInit::negotiatedDataChannelInit::idJava的:
PeerConnection.Observer.onDataChannelDataChannel.Init.negotiatedDataChannel.Init.idOBJ-C:
RTCPeerConnectionDelegate::didOpenDataChannelRTCDataChannelConfiguration::isNegotiatedRTCDataChannelConfiguration::channelId| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |