【问题标题】:How can I connect more than 2 peers?如何连接超过 2 个对等点?
【发布时间】:2020-02-04 09:45:33
【问题描述】:

我希望能够使用 WebRTC 连接任意数量的对等点,并允许它们使用数据通道相互通信。 到目前为止,2 个选项卡中的 2 个本地对等点已经可以成功连接并发送“Hello!”彼此:

<meta charset="utf-8">
<script>
const server = new WebSocket('ws://localhost:1234');

let peer;
let send_channel;

server.onmessage = function(event) {
  const data = JSON.parse(event.data);
  if(data.type == 'offer') {
    peer.setRemoteDescription(new RTCSessionDescription(data));
    peer.createAnswer()
      .then(answer => peer.setLocalDescription(answer))
      .then(() => server.send(JSON.stringify(peer.localDescription)));
  } else if(data.type == 'answer') {
    peer.setRemoteDescription(new RTCSessionDescription(data));
  } else if(data.type == 'candidate') {
    peer.addIceCandidate(new RTCIceCandidate({
      candidate: data.candidate,
      sdpMid: data.sdpMid
    }));
  }
}

server.onopen = function(event) {
  peer = new RTCPeerConnection();
  send_channel = peer.createDataChannel('channel');

  send_channel.onopen = function(event) {
    console.log('Send channel opened:', event);
  }
  send_channel.onclose = function(event) {
    console.log('Send channel closed:', event);
  }

  peer.ondatachannel = function(event) {
    event.channel.onopen = function(event) {
      console.log('Receive channel opened:', event);
      send_channel.send('Hello!');
    }
    event.channel.onclose = function(event) {
      console.log('Receive channel closed:', event);
    }
    event.channel.onmessage = function(event) {
      console.log('Message received:', event);
    }
  }

  peer.onicecandidate = function(event) {
    if (event.candidate) {
      server.send(JSON.stringify(
        {
          type: 'candidate',
          candidate: event.candidate.candidate,
          sdpMid: event.candidate.sdpMid
        }
      ));
    }
  };

  const offer = peer.createOffer()
    .then(offer => peer.setLocalDescription(offer))
    .then(() => server.send(JSON.stringify(peer.localDescription)));
}
</script>

两个选项卡中的控制台输出都是这样的:

Send channel opened: 
open { target: RTCDataChannel, … }
Receive channel opened: 
open { target: RTCDataChannel, … }
Message received: 
message { data: "Hello!", … }

localhost:1234 我有一个正在运行的信号服务器,它允许 WebSocket 连接并升级连接,每当一条消息发送到 WebSocket 时,服务器只会将该消息发送到所有其他连接的 WebSocket,除了发送的 WebSocket消息。

但现在我不确定如何连接超过 2 个对等点。 如果我打开第三个选项卡并尝试连接,我会在所有选项卡的控制台中收到此错误消息:InvalidStateError: Cannot set remote answer in state stable 并且连接中断。

【问题讨论】:

    标签: javascript networking websocket webrtc p2p


    【解决方案1】:

    WebRTC 仅支持 1:1 连接。对于每个想要加入您的网格的新对等点,您将需要创建另一个 PeerConnection。您尝试实现的通常称为 Mesh Topology 我也会研究 SFU,因为您的扩展可能会达到带宽/CPU 限制。

    在您的信令代码中,您可能需要具有某种唯一 ID,然后将消息发送到不同的 PeerConnections。拓扑将如下所示。

    【讨论】:

    • 你认为我应该使用服务器而不是点对点吗?多个对等点似乎很复杂。
    • 两者各有利弊!以下是我能想到的——Pro P2P(E2E 安全,无需付费/管理媒体服务器)——Pro Server(用户只需上传一次,更易于调试)
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多