为什么我的WebRTC连接仅适用于本地网络?

时间:2017-05-16 04:09:33

标签: javascript webrtc

我正在试验WebRTC,只是在data channel上建立聊天。我有一个问题,当两个对等体连接在同一本地网络上时,聊天工作。同行尝试从不同网络连接的地方(我一直用两台计算机连接到我的家庭互联网网络,另一台通过我的手机wifi路由器测试)。

聊天的行为似乎很好,offeranswer通过信令服务器正确发送。使用相同的信令服务器,也会发送ice candidate

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
  }
};

因此,创建offer的对等方仅发送 ONE ice candidate,我认为这是问题,因为创建answer的对等方发送 TWO < / em> ice candidates

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

这是示例console log已发送已收到数据

同行提供连接:

  

sent:CONNECT Object {type:“CONNECT”,caller:Object,callee:null,   room:对象,数据:null}

     

收到:CONNECT Object {type:“CONNECT”,caller:Object,callee:   null,room:Object,data:null}

     

已发送:OFFER对象{类型:“OFFER”,调用者:对象,被调用者:对象,   room:对象,数据:对象}

     

sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

     

sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

     

收到:ANSWER对象{type:“ANSWER”,来电者:对象,被叫者:   对象,房间:对象,数据:对象}

     

收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

同行创建答案:

  

sent:CONNECT Object {type:“CONNECT”,caller:Object,callee:null,   room:对象,数据:null}

     

收到:OFFER对象{type:“OFFER”,来电者:对象,被调用者:对象,   room:对象,数据:对象}

     

收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

     

收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

     

发送:ANSWER对象{类型:“ANSWER”,调用者:对象,被调用者:对象,   room:对象,数据:对象}

     

sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee:   对象,房间:对象,数据:对象}

3 个答案:

答案 0 :(得分:3)

您需要使用STUN服务器进行本地网络外的连接:

  

STUN(用户数据报协议的会话遍历[UDP]通过   网络地址转换器[NATs])服务器允许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); 

您可以查看my code

Web应用程序本身:https://signalrtc.com/

答案 1 :(得分:1)

我同意上面提供的答案,但是当对称natting出现时STUN失败了。

为了让它无缝地工作,你需要有TURN服务器,它也适用于对称natting。

实现保持不变,但它适用于TCP协议,这意味着它跟踪传输的每个数据包。实施如下:

var servers = { 'iceServers':[{ 'urls': 'turn:<turn-server-address>' }] };
connection = new RTCPeerConnection(servers);

这种植入的作用是发送TCP封装的转弯请求,这些请求会进一步解析并发送给收件人。

答案 2 :(得分:0)

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

请参阅Introduction to WebRTC protocols以了解STUN和TURN之间的区别。