2013-09-16 53 views
17

Tôi đang tìm giải pháp cheapo để mở rộng thời gian thực cho nhiều người dùng trong 1 kênh.WebRTC để mở rộng thời gian thực

Tôi đang sử dụng sockj nhưng quy mô khá khó chịu khi nói về số lượng thực sự lớn.

Tôi đang suy nghĩ về việc sử dụng webrtc để giảm chi phí với p2p. Thay vì máy chủ kết nối với tất cả người dùng, nó sẽ kết nối với số lượng người dùng hạn chế, sau đó sẽ phân phối dữ liệu của họ tới mạng p2p thông qua webrtc. Điều này có hợp lý không? Cách dễ nhất để triển khai là gì?

Thông tin không phải là riêng tư và một vài giây < 5s độ trễ có thể chấp nhận được.

Trả lời

12

Vâng, đó là những gì webRTC dành cho: trao đổi dữ liệu giữa các trình duyệt mà không cần máy chủ. Để thực hiện công việc này, bạn có thể nghĩ ra một số kế hoạch quản lý trên máy chủ quản lý các kết nối (vì một khách hàng cần phải nói với khách hàng khác 'hey tôi ở đây, kết nối với tôi ..'), và suy nghĩ về những gì dữ liệu nằm trên ứng dụng khách nào, khi khách hàng cần kết nối với người khác. Là một mẹo: Tôi đã tạo một máy chủ trong các nút bằng cách sử dụng websockets (và plugin nodejs: 'ws') để liên lạc giữa các máy khách cho đến khi RTC được thiết lập để chúng có thể truyền phát âm thanh. Nó thực sự dễ dàng để làm tất cả những thứ này, nhưng một nỗi đau để tinh chỉnh.

Như tôi có thể đọc từ câu hỏi của bạn, bạn không có kinh nghiệm sử dụng webRTC. Chỉ cần cung cấp cho bạn một khởi đầu, đây là thứ tự đúng điều mà cần phải xảy ra để thực hiện một RTC:

Client 1      Server  Client 2 
Create an RTC object 
Create offer 
set localdescription = offer     Create RTC object     
send offer ------------------->  ------>set remote description to offer 
              Create answer 
              local description = answer 
set remote description<--------  <------send answer 

This goes both directions: 
onicecandidate send ---------->  ------>set ICE candidate 

Connection done! 

Đối với việc trao đổi dữ liệu này kết nối lời khuyên của tôi là để đi với WebSockets. Cả hai máy khách đều mở một websocket, và bất cứ khi nào một client gửi một thứ gì đó, bạn có thể lấy kết nối websocket (nó là một đối tượng) từ máy khách khác và gửi mọi thứ. Sử dụng XHR, bạn chỉ có thể cho phép trình duyệt kết nối, yêu cầu dữ liệu và nếu dữ liệu không có lại trong x giây.

tổng: Sử dụng và thiết lập webRTC cho các kết nối ngang hàng là khá dễ dàng, nhưng việc quản lý ai sẽ kết nối với ai sẽ gặp nhiều rắc rối.

Chỉnh sửa: Ý tưởng của tôi sẽ là khách hàng đầu tiên kết nối với máy chủ và nhận dữ liệu của nó bằng XHR hoặc websockets hoặc một cái gì đó tương tự. Nếu bạn muốn tương thích trình duyệt, bạn có thể muốn đi với socket.io, nhưng điều đó sẽ không thực sự quan trọng vì chỉ hỗ trợ chrome và firefox webRTC (afaik). Sau đó, bạn chỉ cần kết nối từ trình duyệt của bạn đến máy chủ. Nếu bạn có kế hoạch có nhiều trao đổi tại cùng một ID phiên sẽ khá thuận tiện, để bạn có thể trao đổi điều đó với những người cần tải xuống.

Ở phía máy chủ, các websockets trả về một đối tượng 'chứa' kết nối hiện tại. Vì vậy, nếu client 1 sẽ kết nối, bạn lưu trữ nó bên trong một đối tượng với ID mà chúng ta đã tạo. Nếu máy khách 2 kết nối, bạn cũng có thể lưu trữ nó. Sau đó, bạn chỉ có thể lấy đối tượng websocket từ máy khách đầu tiên và thực hiện .send('your message').

Bây giờ, thực sự tôi sẽ làm điều đó như thế nào. Tôi sẽ sử dụng (ws) để xác định kết nối qua websocket, (http) cho http request và (rtc) cho webRTC. pc là đối tượng kết nối ngang hàng của bạn: window.dc = new RTCDataChannel(ICEServers);. sdp nghĩa SessionDescriptionProtocol,

  1. Một khách hàng kết nối với máy chủ của bạn và tải các tập tin neccessarry (http) (Tôi có nghĩa là các trang web, các kịch bản và css, không phải là tập tin bạn muốn chia sẻ.)
  2. Các khách hàng yêu cầu một phiên mới. (ws)
  3. máy chủ tạo phiên bản phiên trong một đối tượng.

    var sessID = Math.random(). ToString (36) .substring (12, 16);
    phiên [sessID] = {};

  4. Bạn gửi ID phiên này cho khách hàng (ws) để có thể gửi ID này cho người khác (sử dụng thư, v.v.). Người dùng khác kết nối với máy chủ (http) (ws), nhưng không yêu cầu ID, nó sẽ gửi nó.

  5. Khi máy chủ nhận được thông báo này, máy chủ sẽ gửi cả khách hàng đầu tiên và khách hàng này thông báo chứa cả hai bên đã sẵn sàng. Ứng dụng khách gửi tạo đối tượng webRTC mới và tạo phiếu mua hàng mới (nó lưu trữ phiếu mua hàng này trong dc.setLocalOffer (sdp)). Nó gửi nó đến máy chủ (ws) và máy chủ gửi nó đến máy khách 2 (ws). Bây giờ khách hàng lưu trữ nó bằng cách sử dụng dc.setRemoteDescription(sdp) và tạo câu trả lời. (dc.createAnswer()), đặt câu trả lời này (dc.setLocalDescription(sdp). Câu trả lời này được gửi đến khách hàng một. Bây giờ bạn có thể sử dụng datachannel.

Tôi không biết làm thế nào datachannel exacly hoạt động, như tôi đã chỉ được working with PeerConnection, mà đặc biệt là cho các luồng âm thanh và video. Bạn có thể sử dụng điều này để tìm hiểu cách tạo kết nối. Mã này có trong my repo. Có nhiều mã bên trong hơn vì đây là một 'profielwerkstuk' (một số phôi cho trường học, Những điều thú vị để bạn xem xét là server.js (đây là máy chủ nodejs, được sử dụng để trao đổi các ứng viên sdp và ICE) Trang web nằm trong htdocs/mp.html (không phải thực sự thú vị), và đoạn mã javascript để làm điều này tất cả là trên htdocs/scripts/rtc.js.

Để biết thêm thông tin bạn có thể muốn nhìn vào this example, đồng explainments here

Đã có 'something you want', và nó sử dụng rất nhiều mã để làm điều này càng tốt. Cũng xin lưu ý rằng stackoverflow là đặt câu hỏi, không yêu cầu mã sẵn sàng. Nếu bạn muốn điều đó, hãy xem carreers 2.0, và tìm ai đó muốn làm điều này cho bạn.

Chỉnh sửa 2: Bây giờ tôi thấy câu trả lời của bạn, tôi nghĩ cách tốt nhất để lưu trữ tất cả các kết nối bên trong một mảng bên trong đối tượng phiên của bạn và kết nối máy khách 1 -> 2, 2-> 3, 3-> 4 vv Nhưng sau đó bạn có vấn đề với các bộ phận và như vậy. Hãy suy nghĩ về torrent, nơi bạn kết nối với nhiều người và tải xuống các phần nhỏ từ mỗi người. Nó thực sự khó, vâng, và tôi không nghĩ ai đó đã làm điều gì đó quá lớn (ngoài việc chia sẻ). Nếu bạn thực sự muốn thực hiện điều này, bạn sẽ cần phải làm nhiều nhất cho mình. Hãy dành một chút thời gian để suy nghĩ về cách bạn sẽ giải quyết vấn đề này và sử dụng stackoverflow (hoặc các trang thông tin khác) để tìm cách thiết lập rtc và như vậy.

+0

Cảm ơn, tôi rất thích câu trả lời này! – Harry

+0

Đó là câu trả lời nhanh! Cho tôi biết nếu bạn muốn biết thêm! Tôi đã phải vật lộn để hiểu tất cả điều này nhưng tôi không muốn người khác làm! – MarijnS95

+0

Tôi thấy bạn thậm chí còn thêm tiền thưởng. Câu trả lời này chưa đầy đủ (vì không có câu hỏi 'nâng cao câu hỏi' thực sự ở đó về những gì bạn muốn biết bây giờ bạn đã đọc những câu trả lời này), hay bạn muốn có câu trả lời phức tạp hơn? – MarijnS95

-1

Có điều này là rất hợp lý, WEBRTC là điều lớn nhất tiếp theo khi nói đến truyền thông thời gian thực! Điều gì làm cho nó rất hợp lý là nó được thực hiện trong Javascript. Nó đang tăng lên hàng triệu và đang được hỗ trợ trên nhiều nền tảng hơn như thời gian trôi qua. Đó là chi phí thấp & chất lượng cao!

Tôi không ở đây để bash bạn hoặc bất cứ điều gì, nhưng webrtc thổi Node ra khỏi nước bất cứ ngày nào.

Chọn webrtc, bạn biết mình muốn;)

+0

Tôi không biết làm thế nào điều này sẽ muốn thổi nút đi, vì bạn vẫn cần một số máy chủ để trao đổi dữ liệu để thiết lập một kết nối thời gian thực, và nodejs là hoàn hảo cho điều đó. Họ làm việc cùng nhau như một sự quyến rũ để trao đổi các mô tả phiên và các ứng cử viên ICE thông qua một websocket. – MarijnS95

+0

Tôi không ở đây để bash bạn hoặc bất cứ điều gì, nhưng khoai tây thổi máy kéo ra khỏi nước bất cứ ngày nào. – Brad

4

Hoàn toàn hợp lý.

WebRTC là mạng P2P có độ trễ thấp trong trình duyệt. Nếu trình duyệt của người dùng có hỗ trợ DataChannel thì bạn có thể sử dụng một thư viện như WebTorrent https://github.com/feross/webtorrent.

Ngoài ra, hãy xem triển khai của Sharefest: https://www.sharefest.me/ nó rất giống với ý tưởng bạn đang tìm kiếm.

Để bắt đầu, hãy xem hướng dẫn WebRTC HTML5 Rocks: http://www.html5rocks.com/en/tutorials/webrtc/basics/. Đồng thời thư viện SimpleWebRTC khá tiện dụng: http://simplewebrtc.com/

+0

Oh sharefest là mã nguồn mở. Lời cảm ơn ngọt ngào! – Harry