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

WebRTC跨网连接返回null ICE Candidate问题求助

不同网络下WebRTC返回null ICE Candidate的问题排查与解决

问题现象

在Ubuntu VPS上部署了Coturn服务器,Trickle ICE测试显示正常,但对等端处于不同网络时,连接返回null ICE Candidate;同一局域网内则能正常工作。

测试结果

Trickle ICE测试结果

Trickle ICE test results

控制台ICE Candidate打印结果

iceCandidates

相关代码

ICE服务器配置

const iceServers = {
  iceServer: [
    {
     urls: "stun:stun.biodietfood.com:3478",
    },
    {
     urls: "turn:turn.biodietfood.com:3478?transport=tcp",
     username: "myuser",
     credential: "mypassword",
    },
   ],
};

创建对等连接并发送Offer的代码

rtcPeerConnection = new RTCPeerConnection(); //create peer connection
rtcPeerConnection.setConfiguration(iceServers);
rtcPeerConnection.onicecandidate = onIceCandidate; //generate ice candidate
rtcPeerConnection.onicecandidateerror = iceCandidateError;
rtcPeerConnection.ontrack = onAddStream; // generate the remote stream to send to other user
rtcPeerConnection.addTrack(localStream.getTracks()[0], localStream); // adding video
rtcPeerConnection.addTrack(localStream.getTracks()[1], localStream); // adding audio
rtcPeerConnection // creating offer
  .createOffer({ iceRestart: true })
  .then((sessionDescription) => {
    rtcPeerConnection.setLocalDescription(sessionDescription);
    socket.emit("offer", {
      type: "offer",
      sdp: sessionDescription,
      room: roomNumber,
    });
  })
  .catch((err) => {
    console.log(err);
  });

创建Answer的代码与上述代码基本一致,仅做少量修改。

解决步骤

1. 修正ICE服务器配置的键名错误

你的iceServers对象里用了iceServer作为数组键名,但WebRTC标准要求的是复数形式iceServers,这个错误会导致RTCPeerConnection无法正确识别配置的STUN/TURN服务器。同时建议添加UDP传输的TURN地址,提升兼容性:

const iceServers = {
  iceServers: [
    {
     urls: "stun:stun.biodietfood.com:3478",
    },
    {
     urls: ["turn:turn.biodietfood.com:3478?transport=tcp", "turn:turn.biodietfood.com:3478?transport=udp"],
     username: "myuser",
     credential: "mypassword",
    },
   ],
};

2. 检查Coturn服务器的网络与配置

  • 确认VPS的3478端口(UDP/TCP)、以及TURN中继端口范围(通常49152-65535)已在防火墙和云服务商安全组中开放。
  • 检查Coturn配置文件的external-ip参数,需正确设置为VPS公网IP,格式示例:external-ip=你的公网IP/内网IP(若VPS有内网IP)。
  • 验证服务运行状态:执行turnserver -v查看日志,或用telnet turn.biodietfood.com 3478测试TCP连接,nc -u turn.biodietfood.com 3478测试UDP连接。

3. 优化ICE候选处理逻辑

  • 确保onIceCandidate正确区分有效候选与收集完成的null信号:
function onIceCandidate(event) {
  if (event.candidate) {
    socket.emit("ice-candidate", { candidate: event.candidate, room: roomNumber });
  } else {
    console.log("ICE候选收集完成");
  }
}
  • 完善错误捕获,打印具体信息定位问题:
function iceCandidateError(event) {
  console.error("ICE候选错误:", event.errorCode, event.errorText);
}

4. 验证TURN认证配置

确认Coturn配置中的user参数与代码里的username、credential完全匹配;若使用时间戳认证,需确保代码用户名带时间戳格式,且Coturn开启了lt-cred-mech参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:50:51