【问题标题】:Why my WebRTC connection works only at local network?为什么我的 WebRTC 连接仅适用于本地网络?
【发布时间】:2017-05-16 04:09:33
【问题描述】:

我正在尝试使用WebRTC,只是在data channel 上建立聊天。我有一个问题,当两个对等点都连接在同一个本地网络上时,聊天可以正常工作。同行尝试从不同的网络连接(我一直在用两台计算机进行测试,其中一台连接到我的家庭 Internet 网络,另一台通过我的手机 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 的对等方只发送一个 ice candidate 我认为这是问题因为创建answer 的对等方发送两个 ice candidates .

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

这是 console log 的示例,带有 sentreceived 数据

同行提供连接:

sent: CONNECT Object {type: "CONNECT", caller: Object, callee: null, 房间:对象,数据:空}

收到:CONNECT Object {类型:“CONNECT”,调用者:对象,被调用者: 空,房间:对象,数据:空}

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

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

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

收到:ANSWER Object {类型:“ANSWER”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

收到:候选对象{类型:“候选”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

同行创建答案:

sent: CONNECT Object {type: "CONNECT", caller: Object, callee: null, 房间:对象,数据:空}

收到:OFFER Object {类型:“OFFER”,调用者:对象,被调用者:对象, 房间:对象,数据:对象}

收到:候选对象{类型:“候选”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

收到:候选对象{类型:“候选”,调用者:对象,被调用者: 对象,房间:对象,数据:对象}

sent: ANSWER Object {type: "ANSWER", caller: Object, callee: Object, 房间:对象,数据:对象}

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

【问题讨论】:

  • 如果在注销对象之前对它们进行字符串化,可能会更容易找到错误的线索,例如console.log("sent:", JSON.stringify(data))

标签: javascript webrtc


【解决方案1】:

你需要使用STUN服务器连接外网:

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

例如对于谷歌 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

以及网络应用程序本身:https://signalrtc.com/

【讨论】:

  • @Vardius,你用ip吗?有时它不适用于 DNS
  • 是的,我提供了 stun ip 地址
【解决方案2】:

我同意上面提供的答案,但是当遇到对称 natting 时 STUN 会失败。

为了让它无缝运行,您需要安装 TURN 服务器,它也适用于对称 natting。

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

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

这种植入的作用是发送 TCP 封装的轮次请求,这些请求被进一步解析并发送给接收者。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多