Javascript 为什么我的WebRTC连接只能在本地网络上工作?

Javascript 为什么我的WebRTC连接只能在本地网络上工作?,javascript,webrtc,Javascript,Webrtc,我正在试验WebRTC,只是在数据通道上建立聊天。我有一个问题,当两个对等点连接在同一个本地网络上时,聊天可以正常工作。同龄人尝试从不同的网络连接(我已经用两台计算机进行了测试,一台连接到我的家庭互联网网络,另一台通过我的手机wifi路由器) 聊天的行为似乎很好,提供和应答通过信令服务器正确发送。并且,对于相同的信令服务器,ice候选者也被发送 peer.onicecandidate = (iceEvent: RTCPeerConnectionIceEvent) => { if (ic

我正在试验
WebRTC
,只是在
数据通道上建立聊天。我有一个问题,当两个对等点连接在同一个本地网络上时,聊天可以正常工作。同龄人尝试从不同的网络连接(我已经用两台计算机进行了测试,一台连接到我的家庭互联网网络,另一台通过我的手机wifi路由器)

聊天的行为似乎很好,
提供
应答
通过信令服务器正确发送。并且,对于相同的信令服务器,
ice候选者也被发送

peer.onicecandidate = (iceEvent: RTCPeerConnectionIceEvent) => {
  if (iceEvent.candidate) {
    const message: ConnectionEvent = {
      type: ConnectionEventType.CANDIDATE,
      caller: null,
      callee: event.caller,
      room: event.room,
      data: iceEvent.candidate,
    };

    ws.send(message);
  } else {
    // All ICE candidates have been sent
  }
};
因此,创建
报价
的对等方只发送一个
ice候选人
,我认为这就是问题所在,因为创建
答案
的对等方发送两个
ice候选人

这里有什么问题?我应该什么时候打电话给addIceCandidate

这是示例
控制台日志
,包含发送和接收的数据

对等提供连接:

已发送:连接对象{type:“CONNECT”,调用方:对象,被调用方:null, 文件室:对象,数据:null}

已接收:连接对象{类型:“连接”,调用方:对象,被调用方: null,文件室:对象,数据:null}

发送:提供对象{类型:“提供”,调用方:对象,被调用方:对象, 房间:对象,数据:对象}

已发送:候选对象{类型:“候选”,调用方:对象,被调用方: 对象,房间:对象,数据:对象}

已发送:候选对象{类型:“候选”,调用方:对象,被调用方: 对象,房间:对象,数据:对象}

received:ANSWER对象{type:“ANSWER”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

同行创建答案:

已发送:连接对象{type:“CONNECT”,调用方:对象,被调用方:null, 文件室:对象,数据:null}

received:OFFER对象{type:“OFFER”,调用者:对象,被调用者:对象, 房间:对象,数据:对象}

接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

已发送:应答对象{类型:“应答”,调用方:对象,被调用方:对象, 房间:对象,数据:对象}

已发送:候选对象{类型:“候选”,调用方:对象,被调用方: 对象,房间:对象,数据:对象}

您需要使用服务器连接本地网络外部:

STUN(用户数据报协议[UDP]的会话遍历)通过 网络地址转换器[NAT])服务器允许NAT客户端(即IP 防火墙后的电话)设置与VoIP提供商的电话呼叫 托管在本地网络之外

例如,对于Google STUN服务器:

var servers = { 'iceServers': [{ 'urls': 'stun:74.125.142.127:19302' }] };
//var  _iceServers = [{ url: 'stun:74.125.142.127:19302' }], // stun.l.google.com - Firefox does not support DNS names.

connection = new RTCPeerConnection(servers); 
你可以看看


和web应用程序本身:

根据路由器和/或防火墙的设置方式,您可能还需要配置STUN和TURN


请参阅以了解晕眩和转身之间的区别。

我同意上面提供的答案,但当对称natting出现时,晕眩失败

为了无缝地工作,您需要安装TURN服务器,这也适用于对称NATT

该实现保持不变,但它在TCP协议上工作,这意味着它跟踪传输的每个数据包。实施情况如下:

var servers = { 'iceServers':[{ 'urls': 'turn:<turn-server-address>' }] };
connection = new RTCPeerConnection(servers);
var servers={'iceServers':[{'url':'turn:'}]};
连接=新的RTPeerConnection(服务器);

此植入的作用是发送TCP封装的turn请求,这些请求将被进一步解析并发送到收件人。

@Vardius,您使用ip吗?有时它不适用于DNSYe我提供了stun ip地址如果在注销对象之前对其进行字符串化,可能会更容易找到错误的线索,例如
console.log(“sent:,JSON.stringify(data))