WebRTC出现ICE failed报错,仅配置STUN服务器无法建立点对点连接如何解决
WebRTC ICE 失败报错解决方案
问题根因
- 仅完成了SDP(offer/answer)的交换,没有交换两端生成的ICE候选,ICE协商需要两端收集到的所有网络候选互相配对,才能找到可用的连接路径
- 仅用谷歌公共STUN服务器在部分网络环境(比如对称NAT、企业内网、多层路由环境)下无法完成打洞,需要额外配置TURN服务器
- 手动复制操作可能存在顺序错误,必须严格按照协商流程执行
具体解决步骤
步骤1:补充ICE候选交换逻辑
两端触发onicecandidate回调打印的候选内容,都需要复制后调用对方RTCPeerConnection实例的addIceCandidate方法添加,比如你在A端拿到candidate,要到B端的控制台执行:
// 替换成你从A端复制的candidate字符串 const candidate = JSON.parse("你复制的A端ICE候选字符串") peer.addIceCandidate(new RTCIceCandidate(candidate))
同理B端生成的ICE候选也要复制到A端执行上述逻辑。
步骤2:调整协商操作顺序
严格按照以下流程操作,避免顺序错误导致协商失败:
- 先运行主叫方A的代码,等待2-3秒,等控制台打印出
localDescription(也就是offer)和所有ICE候选后,复制offer完整内容 - 运行被叫方B的代码,先执行
peer.setRemoteDescription(new RTCSessionDescription(你复制的A端offer对象)),等待2-3秒,等B端控制台打印出localDescription(也就是answer)和所有ICE候选后,复制answer完整内容 - 回到A端控制台执行
peer.setRemoteDescription(new RTCSessionDescription(你复制的B端answer对象)) - 最后互相交换两边的所有ICE候选,执行
addIceCandidate添加
步骤3:补充TURN服务器配置(STUN打洞失败时需要)
如果配置STUN后依然报错,说明你的网络环境无法通过P2P直连,需要自行部署TURN服务器,修改servers配置:
const servers = { iceServers: [ {urls: ['stun:stun1.l.google.com:19302']}, { urls: 'turn:你自己的TURN服务器地址:端口', username: '你的TURN用户名', credential: '你的TURN密码' } ] }
效果验证
完成上述操作后等待几秒,如果控制台打印Connection opened说明连接建立成功,此时可以调用chnl.send("测试消息")验证数据通道是否正常。
内容的提问来源于stack exchange,提问作者Tosco
相关产品推荐
相关产品推荐

