room_broadcast
room_broadcast サンプル
概要
room_broadcast サンプルは Diarkis サーバーの Room と P2P 機能を使用したサンプル・プログラムです。2人のユーザーが同じ Room に接続し、Room 経由のリレー通信を行った後、P2P 接続を行い P2P でも通信を行う内容となっています。 room_broadcast サンプルでは以下の機能を確認することができます。
Room の作成
Room への参加
Room メンバーへのメッセージ送信
P2P の開始
P2P でのメッセージの送受信
ローカル環境でサーバーを起動する
サンプルで使用するサーバーを起動するためのチュートリアルを実施して、ローカル環境で Diarkis サーバーを起動します。
room_broadcast サンプル解説
Diarkis ランタイムおよび Diarkis Module を初期化し、Diarkis サーバーへ接続します。 詳細については Diarkis モジュール利用の全体的な流れ を参照してください。
各機能の初期化処理を行います。 本サンプルでは Room モジュールと P2P モジュールを使用するため、Diarkis Module でそれらの機能を初期化します。
// diarkis = Diarkis::DiarkisAllocShared<DiarkisInterface>(uid); ... // P2P モジュールのセットアップ diarkis->SetupP2P(); // Room モジュールのセットアップ diarkis->SetupRoom(false);
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)); }
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)); }
Room の Broadcast で Room に参加しているユーザー全員にメッセージを送信します。
diarkis->GetRoomBase()->SendBroadcastToRoom(buff, bReliable);
Room のオーナーは
DiarkisRoomBase::SendStartP2PSync()
を実行してサーバーへ P2P 接続の開始を通知し、Room に参加しているメンバーの接続先のアドレス・リストを取得します。if (Diarkis::StdString(uid.c_str()) == diarkis->GetRoomBase()->GetOwnerUID()) { // 各メンバーの接続先のアドレスリストを取得する diarkis->GetRoomBase()->SendStartP2PSync(); }
Room のオーナーが
DiarkisRoomBase::SendStartP2PSync()
を実行すると Room に参加しているユーザー全員にDiarkisRoomBase::OnStartP2PSync()
で P2P 接続情報が通知され、これをトリガーにホールパンチを開始します。ホールパンチに成功したら、P2P で通信します。
diarkis->GetP2PBase()->SendBroadcast(buff, RudpType::UNRELIABLE_UNORDERED);
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)); }
終了処理 詳細については Diarkis モジュール利用の全体的な流れ を参照してください。
注意点
P2P のホールパンチを成功させるためには、P2P するクライアントが同じ Room に入っている状態でアドレスを交換して実施しています。
複数のクライアントをご用意頂き、同時に実行して動作を確認してください。
最終更新
役に立ちましたか?