peer.js / webrtc — как настроить супер простое подключение для передачи данных?

Моя ситуация такова, что мне нужно иметь двунаправленный сигнальный канал между двумя компьютерами, которые находятся в одной сети. На самом деле речь идет только об отправке «пингов» туда и обратно. Оба компьютера могут рассматриваться как одинаковые привилегированные.

Я пытался использовать webrtc, абстрагированный peer.js, чтобы открыть простой канал данных. Я хотел бы использовать один и тот же код на обоих клиентах, насколько это возможно.

Идеальным решением было бы следующее: два пользователя могут зайти на веб-сайт и автоматически подключиться друг к другу, не выбирая идентификатор или удаленный идентификатор для подключения.

Я не понимаю: есть ли необходимость специально назначать вызывающего/слушающего или обе стороны могут начать соединение? Может ли кто-нибудь указать мне на самую простую реализацию такого соединения? Я использую бесплатный ключ разработчика для их сервера, чтобы запустить посредничество в соединениях. Спасибо!


person riccardolardi    schedule 03.09.2015    source источник
comment
проверьте socket.io/blog/socket-io-p2p/#, убежище Сам не пробовал, но звучит многообещающе.   -  person mido    schedule 03.09.2015


Ответы (2)


Если вы размещаете свой собственный PeerJS-сервер (что очень просто сделать на heroku, в их репозитории есть кнопка «развернуть на heroku»), вы можете получить список всех подключенных одноранговых узлов, используя это.

listAllPeers(function cb(list){...});

Он отправляет список всех подключенных пиров, вы можете написать рандомизатор, чтобы вернуть идентификатор и соединить эти пиры вместе. Вы также можете заполнить список на экране и попросить пользователя выбрать любой из них. Идентификаторы пиров в этом случае автоматически генерируются сервером для вас.

person iAkashPaul    schedule 05.05.2016

При работе с peer.js вам необходимо знать идентификатор соединения пира, к которому вы хотите подключиться. Это означает, что вам нужна некоторая логика на стороне сервера для установления соединения.

Если вы просто всегда хотите подключать двух последних входящих клиентов, вы можете просто начать с 1 в качестве идентификатора, попытаться создать одноранговый узел и, пока это не удается, увеличить идентификатор и повторить попытку. Затем, если вы преуспели с нечетным числом, ничего не делайте, а когда вы преуспели с четным числом, откройте соединение с вашим id - 1 и начните использовать соединение:

// Use id prefix so we don't collide with other users on peer cloud server
let id_prefix = 'quarnos-';
let id = 0;
let peer = null;
let connection = null;

// Try to initialize peer using incrementing id
do {
  id++;
  peer = new Peer(id_prefix + id);
} while (!peer);

// When someone connects to us, save connection and log message
peer.on('connection', function(incoming_connection) {
  incoming_connection.on('data', function(data){
    if (!connection) {
      connection = incoming_connection;
      connection.send('connection established');
    }
    console.log(data);
    // Here you could put some timed connection.send() logic to make it go back and forth between peers, as requested in the OP
  });
});

// A peer with an even id tries to connect to the peer with id one lower (peer 2 connects to peer 1, etc.)
if (id % 2) {
  let connection = peer.connect(id_prefix + (id - 1));
  connection.on('open', function(){
    console.log('trying to establish connection to ' + id_prefix + (id - 1));
    connection.send('connection opened by ' + (id_prefix + id));
  });
}

Это должно вывести trying to establish connection to quarnos-1 и connection established на узле 2 и connection opened by quarnos-2 на узле 1. Очевидно, что это не очень надежный и просто минимальный пример, который показывает быстрый и грязный способ соединения двух компьютеров. Вам действительно следует реализовать некоторую логику на стороне сервера, которая управляет соединениями и, возможно, сохранить идентификатор соединения в файле cookie, чтобы вы могли повторно подключиться к тому же узлу при перезагрузке страницы.

person adsc    schedule 03.09.2015
comment
пример был бы очень полезен - person Israel Obanijesu; 06.03.2021
comment
@IsraelObanijesu Добавлен код. - person adsc; 12.03.2021