如何使用WebRTC在两个对等方之间协商数据通道?

如何使用WebRTC在两个对等方之间协商数据通道?,webrtc,sctp,rtcdatachannel,Webrtc,Sctp,Rtcdatachannel,WebRTCRTPeerConnection接口有一个方法和一个事件处理程序。这些是如何相互作用的?如何创建可用于在两个对等方之间发送/接收数据的单个数据通道 另外,RTCDataChannelInit构造函数有一个字段,默认情况下该字段设置为false,并表示它会导致在频带内宣布频道。如果设置为true,会发生什么情况?首先:要创建任何数据通道,对等方需要交换一个SDP提供/应答,协商所有数据通道使用的SCTP连接的属性。这在默认情况下不会发生;在调用createOffer之前,您必须调用cr

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


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

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

如果不这样做,数据通道状态将永远停留在连接处

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

带内协商

如果
协商的
字段未设置为
true
,则默认情况下会出现这种情况。一个对等方调用
createDataChannel
,另一个连接到
ondatachannel
EventHandler
。工作原理:

  • 对等A调用
    createDataChannel
  • 正常的报价/应答交换发生
  • 一旦SCTP连接启动,就会在带内从对等a向对等B发送一条消息,告知数据通道的存在
  • 在对等B上,使用从带内消息创建的新数据通道调用
    ondatachannel
    EventHandler
    。它与对等方A创建的数据通道具有相同的属性,现在可以使用这些数据通道双向发送数据
  • 这种方法的优点是,可以随时动态创建数据通道,而无需应用程序执行额外的信令

    带外协商

    数据通道也可以在带外协商。使用这种方法,应用程序不必一边调用
    createDataChannel
    ,另一边监听
    ondatachannel
    ,而只需在两侧调用
    createDataChannel

  • 对等A调用createDataChannel({协商:true,id:0})
  • 对等B还调用
    createDataChannel({协商:true,id:0})
  • 正常的报价/应答交换发生
  • 一旦SCTP连接启动,通道将立即可用(
    readyState
    将更改为
    open
    )。它们由ID匹配,ID是底层SCTP流ID
  • 这种方法的优点是,由于在对等B上创建数据通道不需要在频带内发送消息,因此通道可以更快地使用。这也使得应用程序代码更简单,因为您甚至不需要为数据通道
    ondatachannel
    操心

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

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

    本机应用程序呢?

    如果您使用的是而不是JSAPI,那么它的工作方式也是一样的;事物只是有不同的名称

    C++:

    • PeerConnectionObserver::OnDataChannel
    • DataChannelInit::协商
    • DataChannelInit::id
    爪哇:

    • PeerConnection.Observer.onDataChannel
    • DataChannel.Init.agreemented
    • DataChannel.Init.id
    Obj-C:

    • RTPeerConnectionDelegate::didOpenDataChannel
    • RTCDataChannelConfiguration::isagreemented
    • RTCDataChannelConfiguration::channelId

      • 这里有一篇非常深入的文章,介绍点对点的详细信息

        主要来源

        对等项目的母负载