2

我正在尝试按照此示例创建 DataChannel。

对于我使用 websockets 的信号,它的行为如下:

User A joins

User B joins
User B asks User A to create an offer
-> A opens datachannel before creating an offer
-> A sets his local description
User A sends his offer to User B 
-> B answers the offer
-> B sets local and remote description 
User B sends A his local description

(用户 B 不直接向用户 A 发送消息,这是通过带有中间服务器的 websockets 完成的,该中间服务器保存 websocket 会话,为简单起见跳过该部分)

用户 A 的创建报价代码如下:

let pc = new RTCPeerConnection({
    iceServers: [
        {
            urls: "stun:stun.l.google.com:19302",
        }
    ]
});
let dc = pc.createDataChannel("Base");
dc.onbufferedamountlow = function(){
console.error("dataChannel.onbufferedamountlow");
};
dc.onclose = function(){
    console.error("dataChannel.onclose");
};
dc.onerror = function(){
    console.error("dataChannel.onerror");
};
dc.onmessage = function(){
    console.error("dataChannel.onmessage");
};
dc.onopen = function(){
    console.error("dataChannel.onopen");
};

let offer = await pc.createOffer();
await pc.setLocalDescription(offer);
let offerString = JSON.stringify(pc.localDescription); //Is sent to B

用户 B 的完整代码如下:

let pc = new RTCPeerConnection({
    iceServers: [
        {
            urls: "stun:stun.l.google.com:19302",
        }
    ]
});
await pc.setRemoteDescription(new RTCSessionDescription(offer)); //From A
let answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
let answerString = JSON.stringify(pc.localDescription); //Returns to A

因此,当 A 收到 B 的答案时,它只是:

await pc.setRemoteDescription(new RTCSessionDescription(answer));

A的对象:

用户日志

B的对象:

在此处输入图像描述

Firefox 关于:webrtc 错误

我也尝试过但没有成功:

- 在两个用户都建立连接后打开数据通道,什么都没有,没有任何事件被触发,对此有一些更新:

  1. 在两者上创建数据通道后,我总是将 readyState 视为正在连接...在两个客户端上...RTCPeer数据通道错误的图片

- 在 B 上打开数据通道,而 A 仍在等待 B 的响应,数据通道 onclose 事件被触发,甚至没有触发打开事件......

- 使用https://test.webrtc.org/进行测试,结果如下:

在此处输入图像描述

-我也一直在寻找其他问题或类似于我的问题、论坛、博客等......所有从 2 到 5 岁的答案似乎都已经过时并且不起作用......

- 在两侧创建通道,如下所示:

pc.createDataChannel("Test", {
    id: 1,
    negotiated: true,
})

导致OperationError: Id is in use其中一位客户。如果 DOC 声明如下,我如何通过其 ID 加入频道:

或者(true),它们可以在带外协商,双方使用商定的 id 调用 createDataChannel。

如果我必须通过 ID 加入频道,但在创建对象时我得到该 ID 正在使用中,我该如何加入它?

如果我不指定我得到的 idTypeError: id is required when negotiated is true

虽然医生说:

ID:可选 - 通道的 16 位数字 ID;允许的值为 0-65534。如果您不包括此选项,用户代理将为您选择一个 ID。

  1. 添加await pc.addIceCandidate();or await pc.addIceCandidate(null);,在设置两个连接本地和远程描述之后。

  2. 启动了我自己的TURN 服务器,同时打开了 TCP 和 UDP,结果与 Google 的 STUN 服务器相同。

  3. 尝试在iceServer.

  4. 尝试了 Firefox 和 Chrome 最新版本。

问题:

1) 数据通道何时必须开始打开?在两个客户端都进行了协商并且 pc.connectionState 稳定之后?在创建连接对象之后?设置本地描述之前还是之后?

4

1 回答 1

-1

问题是您需要通过信号交换ICE信息(而不仅仅是 SDP 信息)。

冰是告诉远程对等方知道如何连接,SDP 就像我可以提供什么内容。

于 2020-04-11T11:30:06.657 回答