RTCPeerConnection.createDataChannel() 和 RTCPeerConnection.onDataChannel() 之间的区别

Difference between RTCPeerConnection.createDataChannel() and RTCPeerConnection.onDataChannel()

我最近一直在研究 webRTC,并且正在创建一个抽象层以通过网状网络架构轻松获得多个客户端通信。

我的问题是关于创建数据通道。目前我执行以下操作:

var pc = new RTCPeerConnection(null, {optional: []});

var conn = pc.createDataChannel("testchannel", {});
var conn2 = null;
conn.onmessage = function(evt){
    console.log("onmessage1");
};

pc.ondatachannel = function (event) {
    conn2 = event.channel;
    event.channel.onmessage = function(evt){
        console.log("onmessage2");
    };
};

这导致两个客户端之间似乎打开了 2 个全双工通道。即调用 conn.send("message") 将导致 onmessage1 但调用 conn2.send("message") 将导致 onmessage2。这是正常行为还是我的设置有问题?

为了获得一些额外信息,我正在使用 Chrome42 和 adapter.js

进行测试

数据通道确实是双向的;您只需要为两个对等点创建一个数据通道即可进行通信。正如初始 RTC 连接需要*由 one peer 发送报价和另一个响应创建,数据通道需要由 one[=21= 打开] peer 和另一个可以在 ondatachannel 内抓住它。然后双方将使用该数据通道的 sendon message 进行通信。

* 请注意,您 可以 创建 "negotiated" 数据通道。每个数据通道都有一个id;您可以简单地手动为您的数据通道分配一个 id。如果双方都打开了具有相同 id 的数据通道,则他们不需要 "negotiate" 它并且可以简单地假设另一端正在收听相同的通道。在实践中,我发现这是片状的。

  • 创建数据通道处于活动状态,而打开数据通道处于被动状态。
  • 调用者将调用 createdatachannel,这将 return 一个 rtcdatachannel 对象,稍后可以使用它自己的事件 (onmessage/onopen/onclose) 发送对象和其他东西。
  • 被调用者将确保将函数附加到相应的 peerconnection 的 ondatachannel 事件,该事件将从事件中提取 rtcdatachannel 对象 (mychannel = event.channel)。