WebRTC使用coturn作STUN/TURN服务器公网iceConnectionState始终为checking怎么办
WebRTC公网ICE连接处于checking状态解决方案
一、Coturn服务端配置&运行排查
- 先验证coturn服务可用性:在公网环境下执行
turnutils_uclient -u 你的turn用户名 -w 你的turn密码 -p 3478 你的公网ip,如果能返回正常的relay地址说明服务正常,否则先修复服务问题 - 检查服务器端口开放:需要放通TCP/UDP 3478(STUN/TURN监听端口)、TCP/UDP 8000-9000(媒体中继端口),云服务器默认安全组普遍会拦截UDP端口,这是最常见的故障原因
- coturn配置修正:你当前配置同时写了
user=xxx:xxxx和userdb参数,如果使用静态用户名密码验证,可直接删除userdb配置避免冲突;另外确保external-ip填写的是服务器真实公网IP,不要留占位符 - 查看coturn运行日志:执行
journalctl -u coturn -f查看运行时报错,排查端口占用、证书加载失败等异常
二、前端代码问题修复
- 修复callee(server.js)的代码错误:
onIceCandidate函数的catch块中使用了未定义的error变量,需要替换为参数e,即console.log(failed to add ICE Candidate: ${e.toString()}),该错误会直接导致ICE候选添加失败,连接卡住 - 给所有
setRemoteDescription调用加上try/catch捕获异常并打印错误,排查SDP传输格式异常、SDP不兼容等问题 - 检查ICE配置中的STUN/TURN地址:确保填写的是公网IP或正确域名,不要填内网地址,同时确认用户名、密码和coturn配置完全一致,大小写匹配
- 新增
pc.oniceconnectionstatechange事件监听,打印状态变化过程和错误信息,可快速定位连接卡住的具体阶段
三、网络环境排查
- 确认两端网络没有严格的防火墙限制,部分企业网、校园网会屏蔽UDP协议和STUN/TURN端口,这种情况可配置coturn的TLS TURN(5349端口),走TCP 443端口转发绕开限制
- 不要在localhost/本地回环环境下测试公网部署的服务,要使用真实公网域名/IP访问页面,同时确保页面是HTTPS协议,否则浏览器会限制getUserMedia和WebRTC相关功能
内容的提问来源于stack exchange,提问作者Mfweb
相关产品推荐
相关产品推荐

