Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Akran bağlantılarına başlarken

Eş bağlantıları WebRTC spesifikasyonlarının, eşler arası protokol kullanarak iletişim kurmak için farklı bilgisayarlara iki uygulama bağlama ile ilgili kısmıdır. Eşler arasındaki iletişim video, ses veya keyfi ikili veriler olabilir ( RTCDataChannel API'sini destekleyen istemciler için). İki eşin nasıl bağlanabileceğini keşfetmek için her iki istemcinin de bir ICE Server yapılandırması sağlaması gerekir. Bu bir STUN veya TURN sunucusudur ve rolleri her istemciye ICE adayları sağlamak ve daha sonra uzak eşe aktarılır. ICE adaylarının bu şekilde aktarılmasına genellikle sinyalleme denir.

Sinyal

WebRTC belirtimi, bir ICE (Internet Bağlantısı Kurulumu) Sunucusu ile iletişim kurmak için API'ler içerir, ancak sinyal bileşeni bunun bir parçası değildir. İki eşin nasıl bağlanmaları gerektiğini paylaşmaları için sinyalizasyon gereklidir. Genellikle bu, web uygulamalarının eş bağlantısı başlatılmadan önce gerekli bilgileri iletebildiği normal bir HTTP tabanlı Web API (yani bir REST hizmeti veya başka bir RPC mekanizması) ile çözülür.

Aşağıdaki kod snippet'i, bu kurgusal sinyalleme hizmetinin, iletileri eşzamansız olarak göndermek ve almak için nasıl kullanılabileceğini gösterir. Bu, gerektiğinde bu kılavuzdaki diğer örneklerde kullanılacaktır.

 // 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!');
 

Sinyalizasyon birçok farklı şekilde uygulanabilir ve WebRTC spesifikasyonu herhangi bir özel çözümü tercih etmez.

Akran bağlantılarını başlatma

Her eş bağlantısı bir RTCPeerConnection nesnesi tarafından gerçekleştirilir. Bu sınıfın yapıcısı tek bir RTCConfiguration nesnesini parametresi olarak alır. Bu nesne, eş bağlantının nasıl kurulduğunu tanımlar ve kullanılacak ICE sunucuları hakkında bilgi içermelidir.

RTCPeerConnection oluşturulduktan sonra, çağıran eş veya alıcı eş olmasına bağlı olarak bir SDP teklifi veya yanıtı oluşturmamız gerekir. SDP teklifi veya yanıtı oluşturulduktan sonra, farklı bir kanal aracılığıyla uzak eşe gönderilmelidir. SDP nesnelerini uzak eşlere geçirmeye sinyalleme denir ve WebRTC spesifikasyonu kapsamında değildir.

Eş bağlantı kurulumunu çağıran taraftan başlatmak için, bir RTCPeerConnection nesnesi oluştururuz ve sonra bir RTCSessionDescription nesnesi oluşturmak için createOffer() RTCSessionDescription . Bu oturum açıklaması setLocalDescription() kullanılarak yerel açıklama olarak ayarlanır ve daha sonra sinyal kanalımız üzerinden alıcı tarafa gönderilir. Ayrıca, alıcı tarafından sunulan oturum açıklamamıza bir yanıt alındığında, sinyal kanalımıza bir dinleyici ayarladık.

 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});
}
 

Alıcı tarafta, RTCPeerConnection oluşturmadan önce gelen bir teklifi bekliyoruz. Bu yapıldıktan sonra, alınan teklifi setRemoteDescription() kullanarak setRemoteDescription() . Ardından, alınan teklife yanıt oluşturmak için createAnswer() . Bu yanıt setLocalDescription() kullanılarak yerel açıklama olarak ayarlanır ve sinyal sunucumuz üzerinden arayan tarafa gönderilir.

 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});
    }
});
 

İki eş, hem yerel hem de uzak oturum açıklamalarını ayarladıktan sonra, uzak eşin yeteneklerini bilir. Bu, akranlar arasındaki bağlantının hazır olduğu anlamına gelmez. Bunun işe yaraması için, ICE adaylarını her bir akranda toplamalı ve (sinyal kanalı üzerinden) diğer akranına aktarmalıyız.

ICE adayları

İki eş WebRTC kullanarak iletişim kurabilmeleri için bağlantı bilgilerini paylaşmaları gerekir. Ağ koşulları bir dizi faktöre bağlı olarak değişebileceğinden, bir eşe bağlanmak için olası adayları bulmak için genellikle harici bir hizmet kullanılır. Bu hizmet ICE olarak adlandırılır ve bir STUN veya TURN sunucusu kullanır. STUN, NAT için Oturum Geçişi Yardımcı Programları anlamına gelir ve genellikle çoğu WebRTC uygulamasında dolaylı olarak kullanılır.

TURN (Geçiş Rölesini Kullanarak Geçiş NAT), STUN protokollerini içeren daha gelişmiş bir çözümdür ve çoğu ticari WebRTC tabanlı hizmet, eşler arasında bağlantı kurmak için bir TURN sunucusu kullanır. WebRTC API'sı hem STUN hem de TURN'u doğrudan destekler ve daha eksiksiz İnternet Bağlantı Kuruluşu altında toplanır. Bir WebRTC bağlantısı oluştururken, genellikle RTCPeerConnection nesnesinin yapılandırmasında bir veya birkaç ICE sunucusu sağlıyoruz.

Damlama ICE

Bir RTCPeerConnection nesnesi oluşturulduktan sonra, temel çerçeve, bağlantı kurulması için adayları (ICE adayları) toplamak için sağlanan ICE sunucularını kullanır. RTCPeerConnection üzerindeki olay icegatheringstatechange , ICE toplamanın hangi durumda olduğunu gösterir ( new , gathering veya complete ).

Bir akranın ICE toplantısı tamamlanana kadar beklemesi mümkün olmakla birlikte, bir "damlama buz" tekniği kullanmak ve her ICE adayını keşfedildiği zaman uzak arkadaşınıza iletmek genellikle çok daha etkilidir. Bu, eş bağlantısı için kurulum süresini önemli ölçüde azaltır ve video görüşmesinin daha az gecikmeyle başlatılmasını sağlar.

ICE adaylarını toplamak için icecandidate etkinliği için bir dinleyici ekleyin. Bu dinleyicide yayılan RTCPeerConnectionIceEvent , uzak eşe gönderilmesi gereken yeni bir adayı temsil eden candidate özellik içerecektir (Bkz Sinyalizasyon).

 // 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);
        }
    }
});
 

Bağlantı kuruldu

ICE adayları alındıktan sonra, akran bağlantımızın durumunun sonunda bağlantılı bir duruma dönüşmesini beklemeliyiz. Bunu tespit etmek için, RTCPeerConnection , connectionstatechange RTCPeerConnection olaylarını dinlediğimiz bir dinleyici ekliyoruz.

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

RTCPeerConnection API belgeleri