Google стремится к продвижению расового равенства для чернокожего населения. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Начало работы с экспертными соединениями

Peer соединения является частью спецификации WebRTC, которая занимается подключением двух приложений на разных компьютерах, чтобы общаться, используя протокол равный-равному. Связь между коллегами может быть видео, аудио или произвольные двоичные данные (для клиентов , поддерживающих RTCDataChannel API). Для того, чтобы узнать, как два узла могут подключаться, как клиенты должны предоставить конфигурацию ICE Server. Это либо STUN или TURN-сервер, и их роль заключается в предоставлении кандидатов ICE к каждому клиенту, который затем передается удаленному узлу. Эта передача кандидатов ICE обычно называют сигнализацией.

передача сигналов

Спецификация WebRTC включает в себя интерфейсы для связи с ICE (Создание подключения к Интернету) сервер, но компонент сигнализации не является частью этого. Передача сигналы необходимы для того, чтобы два сверстников поделиться тем, как они должны соединиться. Обычно это решается с помощью обычного HTTP на основе Web API (то есть, служба REST или другой механизм RPC), где веб-приложения могут передавать необходимую информацию перед соединением пэра инициируется.

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

 // Set up an asynchronous communication channel that will be
// used during the peer connection setup
const signalingChannel = new SignalingChannel(remoteClientId);
signalingChannel.addEventListener('message', message => {
    // New message from remote client received
});

// Send an asynchronous message to the remote client
signalingChannel.send('Hello!');
 

Передача сигналов может быть реализован по-разному, и спецификации WebRTC не предпочитает какого-либо конкретного решения.

Инициирование соединения равноправных

Каждое соединение равного обрабатывается RTCPeerConnection объект. Конструктор этого класса принимает один RTCConfiguration объект в качестве параметра. Этот объект определяет, как соединение равного устанавливается и должно содержать информацию о ICE серверах для использования.

После того , как RTCPeerConnection создается нам нужно создать предложение SDP или ответ, в зависимости от того, если мы вызывающие сверстников или получения равного. После того, как предложение SDP или ответ будет создан, он должен быть направлен к удаленному узлу через другой канал. Передача SDP объектов к удаленным аналогам называются сигнализацией и не распространяется на спецификации WebRTC.

Для того, чтобы инициировать установление соединения сверстников от вызывающей стороны, мы создаем RTCPeerConnection объект , а затем вызвать createOffer() , чтобы создать RTCSessionDescription объект. Это описание сеанса устанавливается в качестве локального описания с помощью setLocalDescription() , и затем передается по нашему каналу сигнализации на приемной стороне. Мы также создали слушатель нашего канала сигнализации, когда ответ на предлагаемые нами описание сеанса принимается от принимающей стороны.

 async function makeCall() {
    const configuration = {'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}]}
    const peerConnection = new RTCPeerConnection(configuration);
    signalingChannel.addEventListener('message', async message => {
        if (message.answer) {
            const remoteDesc = new RTCSessionDescription(message.answer);
            await peerConnection.setRemoteDescription(remoteDesc);
        }
    });
    const offer = await peerConnection.createOffer();
    await peerConnection.setLocalDescription(offer);
    signalingChannel.send({'offer': offer});
}
 

На приемной стороне, мы ждем входящего предложения , прежде чем мы создадим RTCPeerConnection экземпляр. После того как это будет сделано , мы устанавливаем принятое предложение , используя setRemoteDescription() . Далее мы называем createAnswer() , чтобы создать ответ на принятое предложение. Ответ на этот вопрос задается в качестве локального описания с помощью setLocalDescription() , а затем отправляется на вызывающей стороне через наш сервер сигнализации.

 const peerConnection = new RTCPeerConnection(configuration);
signalingChannel.addEventListener('message', async message => {
    if (message.offer) {
        peerConnection.setRemoteDescription(new RTCSessionDescription(message.offer));
        const answer = await peerConnection.createAnswer();
        await peerConnection.setLocalDescription(answer);
        signalingChannel.send({'answer': answer});
    }
});
 

После того, как два сверстники установить как локальные и удаленные описания сессии, они знают возможности удаленного узла. Это не означает, что связь между равноправными узлами сети готова. Для этого, чтобы работать, мы должны собрать кандидат ICE на каждый пэр и передачи (по каналу сигнализации) к другому партнеру.

кандидаты ICE

До двух сверстники могут communitcate с использованием WebRTC, они нуждаются в информации, обмен подключения. Так как сетевые условия могут варьироваться в зависимости от dependning ряда факторов, внешняя служба обычно используется для обнаружения возможных кандидатов для подключения к партнеру. Эта услуга называется ICE и использует либо STUN или сервер TURN. STUN означает Session Traversal Утилиты для NAT, и, как правило, используется косвенно в большинстве приложений WebRTC.

TURN (Traversal Использование Relay NAT) является более продвинутым решением, которое включает в себя протоколы STUN и большинство услуг на основе коммерческого WebRTC использовать сервер TURN для установления связей между сверстниками. WebRTC API поддерживает STUN и TURN непосредственно, и собираются под более полным сроком подключения к Интернету Создание. При создании соединения WebRTC, мы обычно предоставляют один или несколько серверов ICE в конфигурации для RTCPeerConnection объекта.

Капельная ICE

После того, как RTCPeerConnection создается объект, лежащий в основе структура использует предоставленные серверы ICE для сбора кандидатов для установления подключения (ICE кандидатов). Событие icegatheringstatechange на RTCPeerConnection сигналов в каком состоянии сбор ДВС представляет собой ( new , gathering или complete ).

Хотя это возможно равноправный ждать, пока сбор ICE не будет завершен, то, как правило, гораздо эффективнее использовать технику «струйка льда» и передачу каждого кандидата ICE к удаленному узлу, как она будет обнаружена. Это позволит значительно сократить время для подключения сверстников настройки и позволяет видеовызов, чтобы начать работу с меньшими задержками.

Для того, чтобы собрать кандидат ICE, просто добавить слушатель для icecandidate события. RTCPeerConnectionIceEvent излучается на этом слушателю будет содержать candidate свойство, представляющее новый кандидат , который должен быть отправлен удаленному узлу (см Signaling).

 // Listen for local ICE candidates on the local RTCPeerConnection
peerConnection.addEventListener('icecandidate', event => {
    if (event.candidate) {
        signalingChannel.send({'new-ice-candidate': event.candidate});
    }
});

// Listen for remote ICE candidates and add them to the local RTCPeerConnection
signalingChannel.addEventListener('message', async message => {
    if (message.iceCandidate) {
        try {
            await peerConnection.addIceCandidate(message.iceCandidate);
        } catch (e) {
            console.error('Error adding received ice candidate', e);
        }
    }
});
 

Соединение установлено

После того, как кандидаты ICE в настоящее время получены, мы должны ожидать, что состояние нашей связи сверстников, в конечном счете превратится в соединенном состоянии. Для того, чтобы обнаружить это, мы добавляем слушателя к нашему RTCPeerConnection , где мы слушаем для connectionstatechange событий.

 // Listen for connectionstatechange on the local RTCPeerConnection
peerConnection.addEventListener('connectionstatechange', event => {
    if (peerConnection.connectionState === 'connected') {
        // Peers connected!
    }
});
 

Документация API RTCPeerConnection