2013-09-16 3 views
17

私は、1チャンネルの多くのユーザーに対してリアルタイムスケーリングのための安価なソリューションを探しています。リアルタイムスケーリングのためのWebRTC

私はsockjsを使用していますが、本当に大きな数字について話すときは、スケーリングはかなり面倒です。

私はwebrtcを使ってp2pでコストを削減することを考えています。サーバーがすべてのユーザーに接続するのではなく、限られた数のユーザーにしか接続できず、そこでwebrtcを介してp2pネットワークにデータを配信します。これは賢明ですか?最も簡単な方法は何ですか?

この情報はプライベートではありません。数秒で< 5秒の遅延が許容されます。

答えて

12

はい、これはwebRTCのためのものです。サーバなしでブラウザ間でデータを交換するのはそうです。この作業を行うには、接続を管理するサーバー上の管理計画を考える必要があるかもしれません(あるクライアントが他のクライアントに「私はここにいます、私に接続してください...」と伝える必要があります)。クライアントが他の誰かに接続する必要がある場合、そのデータはどのクライアントにあるかです。

ヒント:websockets(およびnodejsプラグイン: 'ws')を使用してnodejでサーバーを作って、RTCが設定されてオーディオをストリームできるようになるまでクライアント間で通信します。このようなことはすべて本当に簡単ですが、洗練された痛みです。

私はあなたの質問から読むことができるので、webRTCの使用経験はありません。私のアドバイスは、WebSocketをして行くことであるこの接続でデータを交換するため

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! 

:ちょうどあなたの頭のスタートを与えるために、これは、RTCを作るために起こるために必要なものの右の順です。どちらのクライアントもwebsocketを開き、あるクライアントが何かを送るたびに、他のクライアントからwebsocket接続(オブジェクト)を取得して送信することができます。 XHRを使用すると、ブラウザに接続してデータを要求し、データがない場合はx秒後に再試行できます。

sum:ピアツーピア接続のためにwebRTCを使用して設定するのはかなり簡単ですが、誰が誰に接続すれば問題になるのでしょうか。

編集: 私の考えは、最初のクライアントがサーバーに接続し、そのデータをXHRまたはウェブソケットなどで受け取ることです。ブラウザとの互換性を望むなら、socket.ioと一緒に行きたいかもしれませんが、chromeとfirefoxだけがwebRTC(afaik)をサポートしているので、それは本当に重要ではありません。次に、ブラウザからサーバに接続するだけです。セッションIDが複数の場合、セッションIDはかなり便利なので、ダウンロードしなければならない人々と交換するだけです。

Webサーバーは、現在の接続を含むオブジェクトを返します。したがって、クライアント1が接続する場合は、そのIDを持つオブジェクトの内部に格納します。クライアント2が接続する場合は、それも保存できます。次に、最初のクライアントからwebsocketオブジェクトを取り出し、.send('your message')を実行します。

今、どうすればいいのですか。 WebSocket(http)とwebRTC(rtc)の接続を判断するために(ws)を使用します。 pcはピア接続オブジェクトです:window.dc = new RTCDataChannel(ICEServers);sdp

  1. クライアントがサーバーに接続し、neccessarryファイルが(HTTP)ダウンロード、SessionDescriptionProtocol意味(私はWebページ、スクリプトやCSSを意味し、いないファイルは共有したい。)
  2. は、クライアントが要求します新しいセッション。 (ws)
  3. サーバーはオブジェクト内にセッションのインスタンスを作成します。

    var sessID = Math.random()。toString(36).substring(12,16);
    セッション[sessID] = {};

  4. あなたはこのセッションIDをクライアント(ws)に送信するので、これを他の人に(メールなどを使用して)送信することができます。他のユーザーはサーバー(http)(ws)に接続しますが、IDを要求しないので、それを送信します。

  5. サーバーはこれを受け取ると、最初のクライアントとこのクライアントの両方に、両方の当事者が準備ができているというメッセージを送信します。送信側クライアントは新しいwebRTCオブジェクトを作成し、新しいオファーを作成します(このオファーはdc.setLocalOffer(sdp)に保存されます)。これをサーバー(ws)に送信し、サーバーはこれをクライアント2(ws)に送信します。クライアントはdc.setRemoteDescription(sdp)を使用してそれを保存し、回答を作成します。 (dc.createAnswer())、dc.setLocalDescription(sdp)(この答えを設定します。この答えは、クライアント1に送信されます。今、あなたがデータチャネルを使用することができます。

私だけworking with PeerConnectionされているように私には、データチャネルがexaclyどのように動作するかわからないが、どの特にオーディオとビデオのストリーム用です。これを使用して接続方法を調べることができます。このコードはmy repoにあります。これは 'profielwerkstuk'のためのコードがたくさんあります(学校、興味深いのはserver.jsです(これはnodejsサーバで、sdpとICE候補の交換に使用されます)。このWebページはhtdocs/mp.htmlにあります。本当に面白い)、これを行うためのJavaScriptコードはにあります。詳細については

あなたは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

はい、これは非常に賢明です.WebBRTCは、リアルタイム通信に関して次なる最大のものです!それをとても賢明にするのは、それが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

関連する問題