質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • JavaScript

    16373questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • WebRTC

    76questions

    WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。

skywayでの実装方法:ユーザを自動で部屋にjoinさせる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 359

olee46

score 23

※JavaScriptおよびプログラミング全般初心者です

システムで実現したいこと:

ユーザーが「入室」ボタンをクリック

room1への入室を試みる

room1の参加人数が5人未満であれば、room1へ入室

room1の参加人数が5人以上であれば、room2へ入室を試みる

これを、5人未満のroomが見つかるまで繰り返す

困っていること:

  • peerIdの一覧は取得できるが、どのpeerがどのroomに接続しているかを調べる方法がわからない
  • peerIdとroomを関連付ける(例えば、idを「room1peer1」のようにする)としても、peerIdを付け直す方法がわからない
    一つのプログラム内で、idを指定せずにpeerオブジェクトを生成→idを指定して別のpeerオブジェクトを生成 というのをやってみましたが、エラーが出ましたので、一度peerオブジェクトを生成した場合、新しくidを指定したpeerオブジェクトは生成できないものだと認識しています

知りたいこと:

  1. どのpeerがどのroomに入室しているかを取得する方法
  2. 生成したpeerオブジェクトのidを付け直す方法
  3. データベースとしてpeerとroomを管理する方法

上記のいずれかの方法を知りたいです
3.については、JSがクライアントサイドで、データベースの管理はサーバサイドで実行であることから、難しいのでは?と考えています

補足:

PHPとMySQLを用いて、サーバー側でデータベースとしてpeerとroomの一覧を管理する方法も試しましたが、PHPはサーバサイドでJSはクライアントサイドということで、うまく実装できませんでした
Node.jsについての少し調べましたが、やはりサーバサイドなのでうまくいかないのでは…と考えております

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

どのpeerがどのroomに入室しているかを取得する方法 

こちらに関しては、SkyWay側からは提供されていないので、自分で実装する必要があります。
簡単なのはデータベースを使う方法かと思われます。
サーバーを準備するのが難しいのであれば、Firebase Realtime Databaseなどが使いやすいかと思います。

生成したpeerオブジェクトのidを付け直す方法 

こちらのスライドの21枚目に方法が書かれています。

const peer = new Peer("My ID",{
    key:SKYWAY_API_KEY,
    debug:3,
});


こんな感じですね。

データベースとしてpeerとroomを管理する方法

サーバー側のアプリケーションとクライアントサイドでデータをやり取りするのであれば、APIを作る必要があります。
HTTPリクエストをサーバーに投げると、サーバーからデータを返してくれる仕組みです。
APIを作るための言語は、PHPでも、Node.jsでもOKです。ほかの言語も使えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/23 09:11

    ありがとうございます。いまのところはベストアンサーの方で解決したのですが、Firebaseも見てみたいと思います!

    キャンセル

checkベストアンサー

0

[自分] 部屋に参加する

[ルーム既存メンバー] すでに参加しているメンバーにpeerJoinイベントが発生

[ルーム既存メンバー] peerJoinイベントで自分の参加している部屋のメンバーのカウントを+1

[ルーム既存メンバー] メンバーカウントが参加可能最大人数を超えた場合は、参加したユーザー([自分])に "abort" を送信

[自分] "abort" を受信したら、その部屋から退室し次の部屋へ。 → ループ

とすれば、クライアントのみでも可能ではないでしょうか?

ポイントは、メンバーカウントは自分が参加した以降のメンバーの数であること。これにより、1つのルームのメンバーが複数人いたとしても、それぞれ管理するメンバーカウントは古い人が最大で以降新しいメンバーになるにつれ少なくなりますので、”最大人数越え”と判定するのは1人だけで、"abort"が送信されるのも1回のみとなります。

サンプルを作ってみました。(サンプルではメンバーをカウントするのではなく、配列で管理しています。)
サンプル
MAX_MEMBERという定数が参加可能人数ですのでこれを増減して試してみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/23 09:11

    サンプルコードまでいただき、ありがとうございました!
    自分は配列ではなくcountで制御してみましたが、今のところうまくいっています

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    [PHP]メールアドレスのバリデーションについて

    現在下記のような簡単なメールフォームを製作中です。 データベースは使わず、メールを送信するだけです。 // POSTデータを取得 $post = filter_input_ar

  • 解決済

    teratailのようなQ&Aの掲示板を作りたい

    はじめまして。 このサイトで質問すべきか迷ったのですが投稿させていただきました。 相応しくないようでしたら、その旨ご指摘いただけますでしょうか。 プログラミングの学習サイトのド

  • 解決済

    PHP セッションについて

    PHPでセッションの取得方法について、困っています。 ■ファイル構成 ・index.php ・mailsend.php ・thanks.php 【index.php】 <fo

  • 受付中

    MySQLにphpでアクセスができない

    MySQLでただ単にphpでアクセスするというものなのですが、何故かアクセスできません。。。 過程 まず、ユーザーを作成します。 create user USER@l

  • 解決済

    PHP:XMLを読み込んだ時に配列の有無による条件分岐を無くしたい

    前提・実現したいこと いつもお世話になっております。 XMLを読み込んだ時に$data['room']が配列の場合と配列じゃない場合で今まで分岐させていましたが、分岐させずに同

  • 解決済

    PHP Fatal error: Uncaught exception 'PDOException'...

    PHPのMySQLについてエラーがでてしまいました。 192.168.1.30で実行すると Fatal error: Uncaught exception 'PDOExcept

  • 解決済

    JavascriptによるMySqlエスケープ処理

    JavaScriptから引数を指定してPHPを呼び出し、呼び出されたPHPではMySQL内を引数で検索します。 PHPではいくつかエスケープ用の関数が有りますが、JavaSc

  • 解決済

    ゲームでの位置情報同期処理

    Unityをつかったマルチプレイヤーゲームを考えているのですが、サーバー処理の方法で質問が有ります。 位置情報の同期処理を行いたく、またクライアントに表示される他プ

同じタグがついた質問を見る

  • JavaScript

    16373questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • WebRTC

    76questions

    WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。