room_broadcast

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 サーバーへ接続します。 詳細については 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. 終了処理 詳細については Diarkis モジュール利用の全体的な流れ を参照してください。

注意点

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

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

最終更新