我如何连接两个以上的对等人?

问题描述 投票:1回答:1

我希望能够使用WebRTC连接任意数量的对等设备,并允许它们使用数据通道相互通信。到目前为止,两个选项卡中的两个本地对等方已经可以成功连接并发送“ 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除外。讯息。

但是现在我不确定如何连接两个以上的同行。如果我打开第三个选项卡并尝试连接,则会在所有选项卡的控制台中收到以下错误消息:InvalidStateError: Cannot set remote answer in state stable,并且连接中断。

javascript networking websocket webrtc p2p
1个回答
1
投票

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

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

Mesh Topology

© www.soinside.com 2019 - 2024. All rights reserved.