LogoLogo
日本語
日本語
  • Diarkis ヘルプセンター
  • Diarkis の概要
  • 始めよう
    • Diarkis サーバーテンプレート
    • Diarkis クライアント SDK
    • チュートリアル
      • 1. Diarkis サーバーをローカル環境で起動する
      • 2. テストクライアントで疎通確認する
      • 3. カスタムコマンドを実装する
      • Diarkis クライアントからサーバに接続する
    • サンプル
  • Diarkis のモジュール
    • Room モジュール
      • Room モジュールをサーバーでセットアップする
      • Room サンプル
        • room_broadcast
      • Room モジュールをクライアントから利用する
      • Room のその他の機能
    • MatchMaker モジュール
      • MatchMaker モジュールをサーバーでセットアップする
    • Field モジュール
      • Field モジュールをサーバーでセットアップする
    • P2P モジュール
      • P2P モジュールをサーバーでセットアップする
      • P2P サンプル
    • DM (Direct Message) モジュール
      • DM モジュールをサーバーでセットアップする
    • Notifier モジュール
      • Notifier モジュールをサーバーでセットアップする
    • Session モジュール
      • Session モジュールをサーバーでセットアップする
    • Group モジュール
      • Group モジュールをサーバーでセットアップする
  • Diarkis サーバー
    • Diarkis サーバをクラウド環境で起動する
      • AWS
    • Diarkis サーバーを Windows 環境で起動する
    • MARS サーバー
    • UDP サーバー
    • TCP サーバー
    • HTTP サーバー
    • Metrics API
    • サーバー間通信 - Mesh
  • Diarkis クライアント
    • ランタイム・ライブラリ
      • Diarkis RUDP
    • Diarkis Module
      • Diarkis Module の初期化と終了
      • Diarkis Module のカスタイマイズ
      • Diarkis Module のロギング・システム
      • マイグレーション
      • Diarkis のスレッド
    • サンプル
      • C++
        • room_broadcast
        • directmessage_simple
        • group_sample
        • matching_and_turn
        • matchmaker_ticker
        • p2p_rudp_sample
        • session_simple
      • Unreal Engine Plugin
        • FieldWalker
      • Unity Plugin
        • FieldWalker
          • HowToReplicatePosition.md
  • Diarkis ツール
    • Diarkis CLI
      • cgo を利用するプロジェクトをビルドする方法
      • Diarkis CLI v3 への切り替え手順
  • リファレンス
    • API リファレンス
    • リリースノート
      • v1.0
      • v1.0.1
      • v1.0.2
      • v1.0.3
      • v1.0.4
      • v1.0.5
      • v1.0.6
  • サポート
    • ライセンスと購入
GitBook提供
このページ内
  • room_broadcast サンプル
  • 概要
  • ローカル環境でサーバーを起動する
  • room_broadcast サンプル解説
  • 注意点

役に立ちましたか?

  1. Diarkis のモジュール
  2. Room モジュール
  3. Room サンプル

room_broadcast

前へRoom サンプル次へRoom モジュールをクライアントから利用する

最終更新 9 か月前

役に立ちましたか?

room_broadcast サンプル

概要

room_broadcast サンプルは Diarkis サーバーの Room と P2P 機能を使用したサンプル・プログラムです。2人のユーザーが同じ Room に接続し、Room 経由のリレー通信を行った後、P2P 接続を行い P2P でも通信を行う内容となっています。 room_broadcast サンプルでは以下の機能を確認することができます。

  • Room の作成

  • Room への参加

  • Room メンバーへのメッセージ送信

  • P2P の開始

  • P2P でのメッセージの送受信

ローカル環境でサーバーを起動する

サンプルで使用するサーバーを起動するためのチュートリアルを実施して、ローカル環境で Diarkis サーバーを起動します。

1. Diarkis サーバーをローカル環境で起動する

room_broadcast サンプル解説

  1. Diarkis ランタイムおよび Diarkis Module を初期化し、Diarkis サーバーへ接続します。 詳細については を参照してください。

  2. 各機能の初期化処理を行います。 本サンプルでは Room モジュールと P2P モジュールを使用するため、Diarkis Module でそれらの機能を初期化します。

    // diarkis =  Diarkis::DiarkisAllocShared<DiarkisInterface>(uid); 
    ...
    // P2P モジュールのセットアップ
    diarkis->SetupP2P();
    
    // Room モジュールのセットアップ
    diarkis->SetupRoom(false);
    
  3. Room の RandomJoin で Room に入室します。 DiarkisRoomBase::RandomJoinRoom() は参加可能な Room がすでに存在すればその Room に参加し、存在しなければ新たに Room を作成します。また、DiarkisRoomBase::RandomJoinRoom() でサーバーへリクエストを送信後、実際に Room に参加が完了するまで DiarkisRoomBase::IsJoin() を使用して状態をチェックします。

    diarkis->RandomJoinRoom(10, 60, 0, true);
    
    // DiarkisRoomBase::OnRoomJoinを待つ
    while (diarkis->GetRoomBase()->IsJoin() == false) {
        std::this_thread::sleep_for(std::chrono::milliseconds(30));
    }
  4. Room に想定されている人数が参加するまで待機します。 本サンプルでは 2 ユーザーが同じ Room に参加するまで待機しています。 DiarkisRoomBase::SendGetMemberIDs() を呼び出すと Room に参加しているメンバーのリストの取得をサーバーにリクエストすることが可能です。結果は DiarkisRoomBase::GetRoomMembers() で取得することができます。

    while (1)
    {
        Diarkis::StdVector<Diarkis::StdString> members;
    
        diarkis->GetRoomBase()->SendGetMemberIDs();
        diarkis->GetRoomBase()->GetRoomMembers(members);
    
        if (members.size() == NumPeer)
        {
            break;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    }
  5. Room の Broadcast で Room に参加しているユーザー全員にメッセージを送信します。

    diarkis->GetRoomBase()->SendBroadcastToRoom(buff, bReliable);
  6. Room のオーナーは DiarkisRoomBase::SendStartP2PSync() を実行してサーバーへ P2P 接続の開始を通知し、Room に参加しているメンバーの接続先のアドレス・リストを取得します。

    if (Diarkis::StdString(uid.c_str()) == diarkis->GetRoomBase()->GetOwnerUID())
    {
        // 各メンバーの接続先のアドレスリストを取得する
        diarkis->GetRoomBase()->SendStartP2PSync();
    }
    
  7. Room のオーナーが DiarkisRoomBase::SendStartP2PSync() を実行すると Room に参加しているユーザー全員に DiarkisRoomBase::OnStartP2PSync() で P2P 接続情報が通知され、これをトリガーにホールパンチを開始します。

  8. ホールパンチに成功したら、P2P で通信します。

    diarkis->GetP2PBase()->SendBroadcast(buff, RudpType::UNRELIABLE_UNORDERED);
  9. DiarkisRoomBase::SendLeaveRoom() を実行して Room から退室をサーバーへリクエストします。 本サンプルでは DiarkisRoomBase::IsLeave() を使用して Room から Leave が完了するまで待機しています。

    // Roomから退出
    diarkis->SendLeaveRoom();
    
    // DiarkisRoomBase::OnRoomLeaveを待つ
    while (diarkis->GetRoomBase()->IsLeave() == false) {
        std::this_thread::sleep_for(std::chrono::milliseconds(30));
    }
  10. 終了処理 詳細については を参照してください。

注意点

  • P2P のホールパンチを成功させるためには、P2P するクライアントが同じ Room に入っている状態でアドレスを交換して実施しています。

  • 複数のクライアントをご用意頂き、同時に実行して動作を確認してください。

Diarkis モジュール利用の全体的な流れ
Diarkis モジュール利用の全体的な流れ