首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法创建RTCDataChannel

无法创建RTCDataChannel
EN

Stack Overflow用户
提问于 2020-04-08 18:16:52
回答 1查看 576关注 0票数 2

我正试图跟随这个例子来创建DataChannel。

对于信令,我使用websockets,它的行为如下所示:

代码语言:javascript
复制
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发送消息,这是通过websocket与中间服务器一起完成的,中间服务器持有websocket会话,为了简单起见跳过了该部分)

为用户A创建的提供代码如下:

代码语言:javascript
复制
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的完整代码如下:

代码语言:javascript
复制
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的回答时,它只是:

代码语言:javascript
复制
await pc.setRemoteDescription(new RTCSessionDescription(answer));

A的目的:

B的目的:

Firefox about:webrtc错误

我也尝试过但没有成功:

在两个用户都建立了连接之后,-opening数据通道,没有任何事件会被触发,一些更新如下:

  1. 在创建了两个数据通道之后,我总是认为readyState是连接的.对两个客户..。

-opening数据通道在B上,当A仍在等待B的响应返回时,数据通道on关闭事件被触发,甚至不触发打开的事件.

-using https://test.webrtc.org/进行测试,这是结果:

-我也一直在寻找其他的问题或类似于我的,论坛,博客等.从2岁到5岁的所有答案似乎都过时了,而且不管用.

-creating海峡两边的情况如下:

代码语言:javascript
复制
pc.createDataChannel("Test", {
    id: 1,
    negotiated: true,
})

在其中一个客户端指向OperationError: Id is in use。如何通过通道的ID 如果DOC声明加入通道:

或者(真),他们可以谈判出-带,其中双方调用createDataChannel与一个商定的id.

如果我必须通过ID连接一个通道,但是在创建对象时我得到了正在使用的Id,我如何加入它?

如果我没有指定一个id,我就得到TypeError: id is required when negotiated is true

医生说:

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

  1. 在设置之后添加await pc.addIceCandidate();await pc.addIceCandidate(null);
  2. 使用TCP和UDP启动我自己的转向服务器,结果与Google的STUN服务器相同。
  3. 尝试在iceServer中使用眩晕和旋转服务器。
  4. 试用了Firefox和Chrome的最新版本。

问题:

1)数据通道何时开始开放?在两个客户都完成了重组之后,pc.connectionState是稳定的吗?在创建连接对象之后?在设置本地描述之前还是之后?

EN

回答 1

Stack Overflow用户

发布于 2020-04-11 11:30:06

问题是您需要在信号上交换信息(而不仅仅是SDP信息)。

冰是告诉远程同行知道如何连接,SDP就像是我能提供的内容。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61107353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档