2013-09-16 46 views
17

我正在尋找一種便宜的解決方案來實現1通道中的許多用戶的實時縮放。WebRTC實時縮放

我正在使用sockjs,但在談論真正的大數字時,縮放比較煩人。

我在考慮使用webrtc來降低p2p的成本。服務器連接到所有用戶,而不是連接到只有有限數量的用戶,然後通過webrtc將他們的數據分發到p2p網絡。這是否合理?什麼是最簡單的實施方式?

該信息不是私人的,幾秒鐘< 5秒的延遲是可以接受的。

回答

12

是的,這是webRTC的用途:在沒有服務器的瀏覽器之間交換數據。爲了完成這項工作,你可能想要考慮管理連接的服務器上的一些管理計劃(因爲一個客戶需要告訴另一個客戶'嘿,我在這裏,連接到我..'),並考慮哪些當客戶端需要連接到其他人時,數據在哪個客戶端上。

作爲提示:我使用websockets(和nodejs插件:'ws')在nodejs中創建了一個服務器,以在客戶端之間進行通信,直到RTC設置爲可以流式傳輸音頻。做所有這些都很容易,但是需要改進。

正如我可以從你的問題閱讀,你沒有使用webRTC的經驗。只是給你一個良好的開端,這是需要發生作出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! 

交換這方面的數據我的建議是去使用WebSockets。兩個客戶端都打開一個websocket,並且每當一個客戶端發送一些東西時,就可以從另一個客戶端獲取websocket連接(它是一個對象)併發送消息。使用XHR,您只能讓瀏覽器連接,請求數據,並且數據不在x秒內重試。

總結:使用和設置webRTC進行點對點連接相當容易,但管理誰應該連接誰將會遇到很多麻煩。

編輯: 我的想法是,第一個客戶端連接到服務器,並通過XHR或websockets或類似的東西接收它的數據。如果你想瀏覽器的兼容性,你可能想要去socket.io,但這並不重要,因爲只有Chrome和Firefox支持webRTC(afaik)。然後你只需從瀏覽器連接到服務器。如果您計劃在同一個會話ID中進行多個交換,那麼您可以將其與需要下載它的人交換。

在服務器端,websockets返回一個對象'包含'當前連接。因此,如果客戶端1連接,則將其存儲在具有我們創建的ID的對象中。如果客戶端2連接,您也可以存儲它。然後,您可以從第一個客戶端獲取websocket對象並執行.send('your message')

現在真正的我會怎麼做。我將使用(ws)來確定通過websocket的連接,(http)用於http請求,(rtc)用於webRTC。 pc是您的對等連接對象:window.dc = new RTCDataChannel(ICEServers);sdp意味着SessionDescriptionProtocol

  1. 一個客戶端連接到服務器並下載neccessarry文件(HTTP)(我指的是網頁,腳本和CSS,你想分享而不是文件。)
  2. 客戶端請求新的會議。 (ws)
  3. 服務器在對象內部創建會話實例。

    var sessID = Math.random()。toString(36).substring(12,16);
    sessions [sessID] = {};

  4. 您將此會話ID發送給客戶端(ws),因此它可以將此發送給其他人(使用郵件等)。另一個用戶連接到服務器(http)(ws),但不會請求一個ID,它會發送它。

  5. 當服務器收到此消息時,它會向第一個客戶端和此客戶端發送一條消息,其中包含雙方已準備好的消息。發送客戶端創建一個新的webRTC對象,並創建一個新的報價(它將此報價存儲在dc.setLocalOffer(sdp)中)。它將這發送給服務器(ws),服務器將此發送給客戶端2(ws)。現在客戶使用dc.setRemoteDescription(sdp)來存儲它,並創建一個答案。 (dc.createAnswer()),設置這個答案(dc.setLocalDescription(sdp)。這個答案被髮送到客戶端之一。現在你可以使用datachannel。

我不知道該怎麼datachannel exacly的作品,因爲我只去過working with PeerConnection,這尤其是音頻和視頻流,你可以用它來了解如何建立連接,代碼爲my repo,裏面有很多代碼,因爲這是一個'profielwerkstuk'(一些學校的工件,這是我與朋友做的),有趣的東西是server.js(這是nodejs服務器,用於交換sdp和ICE候選)。網頁位於htdocs/mp.html(不是真的很有意思),而這樣做的JavaScript代碼片段全部在htdocs/scripts/rtc.js

欲瞭解更多信息,你可能想看看this example,並在explainments here

已經有'something you want',並且它使用了大量的代碼,以使這成爲可能。 另外請注意,stackoverflow是問問題,而不是要求現成的代碼。如果你想要的話,看看職業生涯2。0,找到一個想爲你做這個的人。

編輯2: 現在我看到您的答案,我認爲最好的方法是將所有連接存儲在會話對象內的數組中,然後連接客戶端1 - > 2,2 - > 3, 3> 4等。但是,那麼你有零件等問題。想想torrent,在那裏你連接到多個人並從每個人下載小部件。這真的很難,是的,我不認爲有人已經做了這麼大的事情(除了sharefest)。如果你真的想做到這一點,你需要自己做最多的事情。花一些時間考慮如何解決這個問題,並使用stackoverflow(或其他信息站點)來查找如何設置rtc等。

+0

謝謝,我很喜歡這個答案! – Harry

+0

這是一個快速回復!告訴我,如果你想知道更多!我一直在努力去理解這一切,但我不想別人去做! – MarijnS95

+0

我看到你甚至添加了一個賞金。這個答案不夠完整(因爲現在沒有真正的'提高'的問題,關於你現在已經閱讀這些答案的你想知道的內容),還是你想要一個更詳細的答案? – MarijnS95

-1

是的,這是非常明智的,當涉及到實時通信時,WEBRTC是下一個最重要的事情!是什麼讓它如此明智是因爲它是用Javascript完成的。隨着時間的推移,它正在增長數百萬,並在更多的平臺上得到支持。這是低成本&高品質!

我不是在這裏打你或什麼,但是webrtc任何一天都會將節點從水中吹出。

選擇的WebRTC,你知道你想要;)

+0

我不知道這將如何消除節點,因爲您仍然需要一些服務器來交換數據以建立實時連接,並且nodejs非常適合。他們一起努力,通過websocket交換會話描述和ICE候選人。 – MarijnS95

+0

我不是在這裏打你或什麼,但土豆任何一天都會把拖拉機從水裏吹出來。 – Brad

4

完全合理的。

WebRTC是瀏覽器中的低延遲P2P網絡。如果用戶的瀏覽器具有DataChannel支持,那麼你可以使用WebTorrent的類庫https://github.com/feross/webtorrent

另請參見Sharefest的實現:https://www.sharefest.me/它與您正在尋找的想法非常相似。

要開始,請查看HTML5 Rocks WebRTC教程:http://www.html5rocks.com/en/tutorials/webrtc/basics/。此外,SimpleWebRTC庫非常方便:http://simplewebrtc.com/

+0

哦sharefest是開源的。甜,謝謝! – Harry