![](https://habrastorage.org/getpro/habr/post_images/b9a/7e7/636/b9a7e763605bbb5c94e3075cc3b7624a.png)
最近、WebRTCテクノロジーについて多くのことが書かれています。 2つのクライアント間に特殊なサーバーを使用せずに相互作用できますが、サーバーが必要になるのは、接続が確立されてからです。 また、接続自体をインストールする段階では、まだいくつかのサーバーリソースが必要です。 サーバーの必要性を取り除くことは可能ですか? カットの下でこの方向に小さな実験。
rtc接続用のサーバーの必要性は、2つの目的で発生します。 1つは、プロトコル自体をサポートするために必要な技術メッセージの交換を提供するシグナルサーバーです。 幸いなことに、シグナルサーバーの既製の実装がいくつかあり、それらはすべての人の喜びのためにネットワーク上で既に開かれています。 たとえば、キットの便利なpeer.jsライブラリにはクラウドシグナルサーバーもあります。
したがって、質問のこの部分について本当に心配することはできません。 もちろん、クラウドサーバーには接続数に関する多くの制限がありますが、これを開始するには十分です。
しかし、2番目の部分があります。 rtcプロトコルを介した接続のためにシグナルサーバーを操作する前に、参加者は識別子を交換する必要があります。 識別子により、シグナリングサーバーは、多くの潜在的な受信者の中から必要な参加者を選択できます。 そして、識別子情報の配信は開発者にかかっています。 たとえば、peer.jsは、「サイトのユーザー間でピアIDを通信する責任があります」と伝えています。 この問題に対する既成のソリューションは見つかりませんでした。
しかし、ランダムなサブスクライバーとの接続を確立したい場合はどうでしょうか? オンラインゲームの場合、これは必要なものだけかもしれません。 この場合の典型的なソリューションは、登録済み識別子のデータベースを保存する特別なサーバーの作成です。 それほど難しくはありませんが、このサーバーを取り除きたいです。 結局、固定識別子で開かれたrtc接続を介してこの識別子の転送を保証する人はいません。 アイデアはこれです:
- 最初に、クライアントは事前定義された識別子を使用して(peer.jsを使用して)別のユーザーと接続しようとします。 この識別子は、補助的な一時接続にのみ必要です。
signalPeer = new Peer(peer.options); signalConnection = signalPeer.connect('initial_peer');
- 接続に成功した場合、メイン接続に使用されるこのrtcチャネルを介してピアの大事な識別子を送信します。
signalConnection.on('open', function() {signalConnection.send(mainPeerId); } );
- 接続に失敗した場合、いくつかのタイムアウトの後、私たちは事前に定義された識別子でチャネルを作成し、他の誰かが私たちに来るのを待ちます:
setTimeout(function(){ if(!onnected){ signalPeer = new Peer('initial_peer', peer.options); } }, 3000);
- そして最後に、接続に成功したら、もちろん、補助通信チャネルを閉じることを忘れないでください。
すべてのコードは50行に収まります。 ミニライブラリの形式で登録した後(ここからダウンロードできます: github.com/bay73/puzzleduel/blob/master/randompeer.js )、次のように使用できます。
var peer = new Peer({key: key}); connectRandom(peer, function(connection) { // connection.on('data'), function(data){ /* */}); connection.send(data); /* */ }, function() { // } );
github: bay73.github.io/puzzleduelに基づいて作成されたおもちゃの完全なコードを表示し、負荷テストを提供できます。 週の終わりの期待を明るくする人がいるかもしれません。 主な問題は、すべてのブラウザー(およびすべてのバージョン)WebRTCが完全にサポートしているわけではないことです。
しかし、プレイしたくない人にとっては、問題は-そのようなアプローチは顕著なユーザー負荷で機能するのでしょうか?