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

标签 javascript webrtc

我正在试验 WebRTC,只是在 数据通道 上建立聊天。我有一个问题,即当两个对等方都连接到同一本地网络时,聊天才能正常进行。同行尝试从不同网络连接的地方(我一直在用两台电脑测试这个,一台连接到我的家庭互联网网络,另一台通过我的手机 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 的节点 发送两个 ice candidates

这里有什么问题?我应该什么时候调用 addIceCandidate

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

同行提供连接:

sent: CONNECT Object {type: "CONNECT", caller: Object, callee: null, room: Object, data: null}

recieved: CONNECT Object {type: "CONNECT", caller: Object, callee: null, room: Object, data: null}

sent: OFFER Object {type: "OFFER", caller: Object, callee: Object, room: Object, data: Object}

sent: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

sent: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

recieved: ANSWER Object {type: "ANSWER", caller: Object, callee: Object, room: Object, data: Object}

recieved: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

同行创建答案:

sent: CONNECT Object {type: "CONNECT", caller: Object, callee: null, room: Object, data: null}

recieved: OFFER Object {type: "OFFER", caller: Object, callee: Object, room: Object, data: Object}

recieved: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

recieved: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

sent: ANSWER Object {type: "ANSWER", caller: Object, callee: Object, room: Object, data: Object}

sent: CANDIDATE Object {type: "CANDIDATE", caller: Object, callee: Object, room: Object, data: Object}

最佳答案

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

A STUN (Session Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs]) server allows NAT clients (i.e. IP Phones behind a firewall) to setup phone calls to a VoIP provider hosted outside of the local network.

例如 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 .

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

关于javascript - 为什么我的 WebRTC 连接只能在本地网络上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43992334/

相关文章:

javascript - 在 Heroku 上访问 Javascript 中的环境变量?

php - 选中复选框后如何添加隐藏的文本区域

javascript - 在 Lambda 函数中使用 Firebase API AWS

three.js - 如何使用 WebRTC 流式传输 webGL Canvas ?

authentication - 如何验证 PeerJS 与 PeerServer 的连接?

javascript - 两个动态生成的 Bootstrap Accordion 相互冲突

javascript - react native : is it possible to stop PanResponder event inside onPanResponderMove?

javascript - 与 WEBRTC 的单向通信

javascript - webRTC HTML5 白板/视频聊天

Android WebRtc 本地视频流不显示在棉花糖上,但适用于 Lollipop