Я пытаюсь использовать простую одноранговую библиотеку для установления соединений WebRTC между браузерами (каналы данных). Насколько я понимаю (возможно, у меня есть какое-то заблуждение), чтобы два браузера могли подключаться через WebRTC, они должны обмениваться данными SDP и выполнять обход NAT. Для этого может быть реализован STUN-сервер.
В простой одноранговой библиотеке они заявляют, что простой одноранговый узел не реализует протокол сигнализации, но предоставляет метод предоставления серверов STUN / ICE. Рассмотрим следующие три файла HTML из их примера сетки:
peer1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Peer1</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
// These are peer1's connections to peer2 and peer3
var peer2 = new SimplePeer({ initiator: true, config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
} })
var peer3 = new SimplePeer({ initiator: true, config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
} })
peer2.on('signal', data => {
console.log(data)
})
peer2.on('connect', () => {
peer2.send('hi peer2, this is peer1')
})
peer2.on('data', data => {
console.log('got a message from peer2: ' + data)
})
peer3.on('signal', data => {
console.log(data)
})
peer3.on('connect', () => {
peer3.send('hi peer3, this is peer1')
})
peer3.on('data', data => {
console.log('got a message from peer3: ' + data)
})
</script>
</body>
</html>```
peer2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Peer2</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
// These are peer2's connections to peer1 and peer3
var peer1 = new SimplePeer({
config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
}
})
var peer3 = new SimplePeer({ initiator: true, config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
} })
peer1.on('signal', data => {
console.log(data)
})
peer1.on('connect', () => {
peer1.send('hi peer1, this is peer2')
})
peer1.on('data', data => {
console.log('got a message from peer1: ' + data)
})
peer3.on('signal', data => {
console.log(data)
})
peer3.on('connect', () => {
peer3.send('hi peer3, this is peer2')
})
peer3.on('data', data => {
console.log('got a message from peer3: ' + data)
})
</script>
</body>
</html>
peer3.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Peer3</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
// These are peer3's connections to peer1 and peer2
var peer1 = new SimplePeer({
config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
}
}
)
var peer2 = new SimplePeer({
config: {
iceServers: [
{urls: 'stun:stun.a-mm.tv:3478'}
]
}
})
peer1.on('signal', data => {
console.log(data)
})
peer1.on('connect', () => {
peer1.send('hi peer1, this is peer3')
})
peer1.on('data', data => {
console.log('got a message from peer1: ' + data)
})
peer2.on('signal', data => {
console.log(data)
})
peer2.on('connect', () => {
peer2.send('hi peer2, this is peer3')
})
peer2.on('data', data => {
console.log('got a message from peer2: ' + data)
})
</script>
</body>
</html>
Как видите, я добавил туда два STUN-сервера. Не обменивается ли STUN необходимыми сигнальными данными? Однако, рассматривая свои проблемы, они рекомендуют использовать веб-сокеты для обмена такими данными. Могу ли я тогда предположить, что STUN предназначен только для того, чтобы каждый одноранговый узел мог сначала собрать информацию SDP, а затем использовать веб-узлы для обмена ею? И что тогда, после этого, браузеры могут устанавливать каналы данных друг с другом?
Почему я подумал, что с этим справился STUN? Кажется немного избыточным вводить веб-сокеты, когда STUN уже может предоставлять данные клиентам. Конечно, цель состоит в том, чтобы как можно скорее отказаться от всех коммуникаций с центральным сервером в пользу каналов данных между браузерами.
Хороший ответ может ответить на эти вопросы и изменить пример.