我正在尝试按照此示例创建 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的对象:
我也尝试过但没有成功:
- 在两个用户都建立连接后打开数据通道,什么都没有,没有任何事件被触发,对此有一些更新:
- 在 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。
添加
await pc.addIceCandidate();
orawait pc.addIceCandidate(null);
,在设置两个连接本地和远程描述之后。启动了我自己的TURN 服务器,同时打开了 TCP 和 UDP,结果与 Google 的 STUN 服务器相同。
尝试在
iceServer
.尝试了 Firefox 和 Chrome 最新版本。
问题:
1) 数据通道何时必须开始打开?在两个客户端都进行了协商并且 pc.connectionState 稳定之后?在创建连接对象之后?设置本地描述之前还是之后?