Google cam kết thúc đẩy bình đẳng chủng tộc đối với cộng đồng đen. Xem cách.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Bắt đầu với các kết nối ngang hàng

kết nối ngang hàng là một phần của các chi tiết kỹ thuật WebRTC được rằng thỏa thuận với kết nối hai ứng dụng trên máy tính khác nhau để giao tiếp bằng cách sử dụng giao thức peer-to-peer. Các thông tin liên lạc giữa các đồng nghiệp có thể được video, dữ liệu nhị phân âm thanh hoặc tùy ý (đối với khách hàng hỗ trợ RTCDataChannel API). Để khám phá cách hai đồng nghiệp có thể kết nối, cả khách hàng cần cung cấp một cấu hình ICE Server. Đây là một trong hai STUN hay TURN-server, và vai trò của họ là cung cấp cho các ứng cử viên ICE để mỗi khách hàng mà sau đó được chuyển giao cho các đồng đẳng từ xa. Đây chuyển của các ứng cử viên ICE thường được gọi là tín hiệu.

hiệu

Các đặc điểm kỹ thuật WebRTC được bao gồm các API để giao tiếp với một ICE (Internet kết nối thành lập) Server, nhưng các thành phần tín hiệu không phải là một phần của nó. Hiệu là cần thiết để cho hai đồng nghiệp để chia sẻ làm thế nào họ nên kết nối. Thường này được giải quyết thông qua một HTTP dựa trên Web API thường xuyên (ví dụ, một dịch vụ REST hoặc cơ chế RPC khác), nơi các ứng dụng web có thể chuyển tiếp các thông tin cần thiết trước khi kết nối ngang hàng được bắt đầu.

đoạn mã code sau cho thấy cách dịch vụ truyền tín hiệu fictious này có thể được sử dụng để gửi và nhận tin nhắn không đồng bộ. Điều này sẽ được sử dụng trong các ví dụ còn lại trong hướng dẫn này khi cần thiết.

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

Tín hiệu có thể được thực hiện bằng nhiều cách khác nhau, và các đặc điểm kỹ thuật WebRT không thích bất kỳ giải pháp cụ thể.

Khởi kết nối ngang hàng

Mỗi kết nối ngang hàng được xử lý bởi một RTCPeerConnection đối tượng. Các constructor cho lớp này mất một đơn RTCConfiguration đối tượng như tham số của nó. Đối tượng này định nghĩa cách kết nối ngang hàng được thiết lập và cần chứa thông tin về các máy chủ ICE để sử dụng.

Khi RTCPeerConnection được tạo ra chúng ta cần phải tạo ra một lời đề nghị SDP hoặc câu trả lời, tùy thuộc vào nếu chúng ta là những kêu gọi ngang hàng hoặc nhận đồng đẳng. Khi lời đề nghị SDP hoặc câu trả lời được tạo ra, nó phải được gửi cho các đồng đẳng từ xa thông qua một kênh khác nhau. Đi qua SDP đối tượng để các đồng nghiệp từ xa được gọi là báo hiệu và không được bao phủ bởi các đặc điểm kỹ thuật WebRT.

Để bắt đầu thiết lập kết nối ngang hàng từ phía bên gọi điện thoại, chúng tôi tạo ra một RTCPeerConnection đối tượng và sau đó gọi createOffer() để tạo ra một RTCSessionDescription đối tượng. Mô tả Phần này được thiết lập như mô tả địa phương sử dụng setLocalDescription() và sau đó được gửi qua kênh tín hiệu của chúng tôi để các bên tiếp nhận. Chúng tôi cũng thiết lập một người biết lắng nghe kênh phát tín hiệu của chúng tôi khi một câu trả lời để mô tả phiên được chào bán của chúng tôi nhận được từ phía nhận.

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

Về phía nhận, chúng tôi chờ đợi một lời đề nghị đến trước khi chúng ta tạo của chúng tôi RTCPeerConnection dụ. Khi đã xong chúng tôi đặt lời đề nghị đã nhận sử dụng setRemoteDescription() . Tiếp theo, chúng ta gọi là createAnswer() để tạo ra một câu trả lời cho lời đề nghị nhận được. Câu trả lời này được thiết lập như mô tả địa phương sử dụng setLocalDescription() và sau đó được gửi sang bên gọi trên máy chủ phát tín hiệu của chúng tôi.

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

Một khi hai đồng nghiệp đã đặt cả giới thiệu phiên địa phương và từ xa họ biết khả năng của các đồng đẳng từ xa. Điều này không có nghĩa là mối liên hệ giữa các đồng nghiệp đã sẵn sàng. Để làm việc này chúng ta cần phải thu thập các ứng cử viên ICE tại mỗi peer và chuyển giao (qua kênh tín hiệu) để các peer khác.

ứng cử viên ICE

Trước khi hai đồng nghiệp có thể sử dụng communitcate WebRTC, họ cần phải thông tin kết nối trao đổi. Kể từ khi các điều kiện mạng có thể khác nhau dependning trên một số yếu tố, một dịch vụ bên ngoài thường được sử dụng để khám phá những ứng cử viên có thể cho kết nối với một đồng đẳng. Dịch vụ này được gọi là ICE và đang sử dụng hoặc là một STUN hoặc một máy chủ TURN. STUN là viết tắt của phiên Traversal Utilities cho NAT, và thường được sử dụng trong hầu hết các ứng dụng gián tiếp WebRT.

Xoay (Traversal Sử dụng Rơ le NAT) là giải pháp tiên tiến hơn mà kết hợp các giao thức STUN và hầu hết các dịch vụ dựa trên WebRTC của thương mại sử dụng một máy chủ lần lượt cho việc thiết lập mối liên hệ giữa các đồng nghiệp. Các WebRTC của API hỗ trợ cả STUN và biến trực tiếp, và nó được thu thập dưới hoàn chỉnh hơn về lâu Internet kết nối thành lập. Khi tạo một kết nối WebRTC, chúng tôi thường cung cấp một hoặc một số máy chủ ICE trong cấu hình cho RTCPeerConnection đối tượng.

trickle ICE

Khi một RTCPeerConnection đối tượng được tạo ra, trong khuôn khổ cơ bản sử dụng các máy chủ ICE cung cấp để thu thập các ứng cử viên thành lập kết nối (ứng cử viên ICE). Sự kiện này icegatheringstatechange trên RTCPeerConnection tín hiệu trong những gì nhà nước thu thập ICE là ( new , gathering hoặc complete ).

Mặc dù có thể cho một peer đợi cho đến khi thu thập ICE hoàn tất, nó thường là nhiều hơn nữa hiệu quả sử dụng một "băng nhỏ giọt" kỹ thuật và truyền mỗi ứng cử viên ICE để peer từ xa vì nó được phát hiện. Điều này sẽ làm giảm đáng kể thời gian thiết lập cho các kết nối ngang hàng và cho phép một cuộc gọi video để bắt đầu với sự chậm trễ ít hơn.

Để thu thập các ứng cử viên ICE, chỉ cần thêm một người biết lắng nghe cho icecandidate sự kiện. Các RTCPeerConnectionIceEvent phát ra trên người nghe sẽ chứa candidate bất động sản đại diện cho một ứng cử viên mới phải được gửi đến các đồng đẳng từ xa (Xem tín hiệu).

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

Kết nối thành lập

Một khi các ứng cử viên ICE đang được nhận, chúng ta nên mong đợi nhà nước đối với kết nối ngang hàng của chúng tôi cuối cùng sẽ chuyển sang trạng thái kết nối. Phát hiện này, chúng tôi thêm một người biết lắng nghe để chúng tôi RTCPeerConnection nơi chúng tôi lắng nghe connectionstatechange sự kiện.

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

Tài liệu RTCPeerConnection API