我希望能够使用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
,并且连接中断。