גוגל מחוייב לקידום עצמי גזעי עבור קהילות שחורות. תראה איך.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

תחילת עבודה עם חיבורי peer

חיבורים פאר הוא חלק מפרטי WebRTC כי עסקאות עם חיבור שני יישומים במחשבים שונים כדי לתקשר באמצעות פרוטוקול peer-to-peer. התקשורת בין עמיתים יכולה להיות וידאו, נתונים בינאריים אודיו או שרירותיים (ללקוחות תמיכת RTCDataChannel API). כדי לגלות איך שני עמיתים יכולים להתחבר, הן הלקוחות צריכים לספק תצורת שרת ICE. זה הוא או הלם או תפנית שרת, ותפקידם הוא לספק מועמדי ICE לכל לקוח שלאחר מכן מועבר אל העמיתים המרוחקים. זה מעביר מועמדים ICE נקרא בדרך איתות.

איתות

המפרט WebRTC כולל APIs לתקשורת עם ICE (הקמת קישוריות אינטרנט) שרת, אך המרכיב איתות הוא לא חלק ממנה. איתות שדרוש על מנת ששתיים עמיתים לשתף איך הם צריכים להתחבר. בדרך כלל זו נפתרת באמצעות API אינטרנט רגיל מבוסס HTTP (כלומר, שירות REST או מנגנון RPC אחר) שבו יישומי אינטרנט יכולים לשדר את המידע דרוש לפני חיבור peer הוא יזם.

קוד מעקב הקטע מראה כיצד שירות איתות fictious זה יכול לשמש כדי לשלוח ולקבל הודעות אסינכרוני. זה ישמש בדוגמאות הנותרים במדריך זה במידת הצורך.

 // 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. הלם מייצג Utilities חציית מושב עבור NAT, ובדרך כלל משמש בעקיפין ברוב היישומים WebRTC.

TURN (חציית באמצעות ממסר NAT) הוא הפתרון המתקדם יותר שתכלול גם את הפרוטוקולים STUN ורוב השירותים המסחריים מבוסס WebRTC להשתמש בשרת TURN ליצירת קשרים בין בני גילם. ה- API של WebRTC תומך הוא STUN ולהפוך ישירות, והוא התאסף תחת המונח השלם יותר הקמת קישוריות לאינטרנט. בעת יצירת קשר WebRTC, אנחנו בדרך כלל מספקים שרתי ICE אחד או כמה בתצורה עבור RTCPeerConnection האובייקט.

ICE Trickle

פעם RTCPeerConnection אובייקט נוצר, במסגרת הבסיסית משתמשת בשרתי ICE מסופקים לאסוף מועמדי הקמת קישוריות (מועמדי ICE). האירוע icegatheringstatechange על RTCPeerConnection אותות באיזה מצב איסוף ICE הוא ( new , gathering או complete ).

אמנם זה אפשרי עבור עמית לחכות עד איסוף ICE יושלם, זה בדרך כלל הרבה יותר יעיל להשתמש בטכניקת "קרח טפטוף" ולהעביר כל מועמד ICE אל העמיתים המרוחקים כפי שהוא מקבל גילה. זה יקטין את זמן ההתקנה משמעותי עבור קישוריות העמיתים ולאפשר שיחת וידאו כדי להתחיל עם עיכובים פחות.

כדי לאסוף מועמדי ICE, פשוט להוסיף מאזין עבור icecandidate האירוע. RTCPeerConnectionIceEvent הנפלט על המאזין שיכיל candidate נכס מייצג מועמד חדש שאמורות להישלח העמיתים המרוחקים (איתות See).

 // 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