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

离线状态下Local WebRTC连接卡在‘checking’状态的技术求助

问题原因分析

这个问题我之前也碰到过,核心原因是你用了默认的RTCPeerConnection配置——当你传入null时,浏览器会自动添加公共STUN服务器(比如谷歌的stun.l.google.com:19302)。在线时这些服务器能正常响应,帮浏览器收集到可用的ICE候选,连接自然能顺利建立;但离线时,浏览器无法访问这些外部服务器,会一直卡在ICE候选收集阶段,导致iceConnectionState停留在checking状态,它在等STUN的响应,而永远等不到。

解决方案

显式指定ICE服务器为空数组,告诉浏览器只使用本地候选(host candidates),完全不依赖外部STUN/TURN服务器:

把代码中两处的new RTCPeerConnection(null)修改为:

new RTCPeerConnection({ iceServers: [] })

修改后的关键代码片段

Joiner 部分:

(() => {
  const log = (message) => logWithIndent(message, 50);
  // 显式设置空ICE服务器列表
  const pc = new RTCPeerConnection({ iceServers: [] });
  const sdpConstraints = { optional: [{RtpDataChannels: true}] };
  // 剩余代码保持不变...
})();

Creator 部分:

(() => {
  const log = (message) => logWithIndent(message, 0);
  // 显式设置空ICE服务器列表
  const pc = new RTCPeerConnection({ iceServers: [] });
  let dataChannel = null;
  // 剩余代码保持不变...
})();
为什么这样能解决问题?

当iceServers为空时,浏览器只会收集本地IP地址对应的host候选,不需要和任何外部服务器通信。对于单台电脑内的WebRTC连接(同一页面的两个PeerConnection实例),host候选完全足够完成连接——因为两个Peer都在同一设备上,直接通过本地IP就能完成ICE协商,离线环境下也能正常走完连接流程。

验证步骤
  1. 修改代码后保存HTML文件;
  2. 断开电脑网络,刷新页面;
  3. 观察日志会看到:iceConnectionState顺利从checking过渡到connected,并且正常输出PONG: Hello World!。

内容的提问来源于stack exchange,提问作者user1914860

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:11:14