You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:调整协商操作顺序

严格按照以下流程操作,避免顺序错误导致协商失败:

  1. 先运行主叫方A的代码,等待2-3秒,等控制台打印出localDescription(也就是offer)和所有ICE候选后,复制offer完整内容
  2. 运行被叫方B的代码,先执行peer.setRemoteDescription(new RTCSessionDescription(你复制的A端offer对象)),等待2-3秒,等B端控制台打印出localDescription(也就是answer)和所有ICE候选后,复制answer完整内容
  3. 回到A端控制台执行peer.setRemoteDescription(new RTCSessionDescription(你复制的B端answer对象))
  4. 最后互相交换两边的所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:57:02