WebRTC RTCDataChannel readyState何时转为open?是否需要服务器?
WebRTC DataChannel 连接问题解惑
先梳理下你的场景:你用谷歌提供的测试STUN服务器搭建了简单WebRTC原型,ICE服务器配置类似这样:
var servers = [ "stun:stun.l.google.com:19302", ... ];
然后直接在浏览器中打开两个本地文件(没有搭建NodeJS这类服务器),虽然成功创建了RTCPeerConnection和RTCDataChannel对象,但RTCDataChannel的onopen回调从未触发,readyState始终卡在"connecting"状态。相关代码片段如下:
window.localConnection = localConnection = new RTCPeerConnection(configuration); // configuration包含iceServer配置 localChannel = localConnection.createDataChannel('data'); localChannel.onopen = function () { // 该回调从未执行 var readyState = localChannel.readyState; console.log('Local channel state is: ' + readyState); }
下面针对你的两个问题逐一解答:
问题1:是否需要NodeJS这类服务器才能让readyState变为"open"?
没错,你必须要有一个信令服务器(NodeJS只是常见的实现方案,用Python、Java等后端语言也能实现)。WebRTC只负责端到端的媒体/数据传输,但它没办法自己完成两个客户端之间的"握手"——也就是交换SDP会话描述和ICE候选地址。
你现在直接打开本地文件,两个浏览器实例之间没有任何渠道交换这些关键信息,它们根本找不到彼此的位置,自然无法建立连接,DataChannel也就永远停留在"connecting"状态。信令服务器的核心作用就是当中间的"信使",帮助两端传递这些必要的信令数据。
问题2:readyState何时会转为"open"状态?
只有当两端的RTCPeerConnection完成信令交换和ICE连通性校验之后,DataChannel才会进入"open"状态。具体流程大致如下:
- 发起端创建DataChannel后,生成SDP offer,通过信令服务器发送给接收端;
- 接收端收到offer后,设置自身的remote描述,生成SDP answer,再通过信令服务器回传给发起端;
- 两端收集到ICE候选地址后,同样通过信令服务器互相发送;
- 当两端找到可用的连通路径(比如通过STUN服务器获取的公网地址,或是局域网内的直接地址),并且成功建立起PeerConnection连接时,DataChannel的
readyState就会从"connecting"切换为"open",这时onopen回调才会触发。
内容的提问来源于stack exchange,提问作者Joseph D.
相关产品推荐
相关产品推荐

