関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2015.08.25UE4UE/ Network
こんにちは。ほげたつ(@HogeTatu)です。
前回に引き続き、HTTP通信の中身を見ていきたいと思います。
今回はプログラマ向けの内容となります。
また、UE4のバージョンは 4.8.3 を想定しています。
HTTP通信に関係するコードは主に Engine/Source/Runtime/Online/Http に展開されています。
また、プラットフォームネイティブな処理が多いため、Engine/Source/Runtime/Core/Public にも宣言のみが存在します。
ひとまず、いくつかピックアップして内部を見ていこうと思います。
Engine/Source/Runtime/Online/HTTP/Public/HttpModule.h
Engine/Source/Runtime/Online/HTTP/Private/HttpModule.cpp
HTTPモジュールの管理者です。
新規リクエストの作成や、エンジンのコンフィグからタイムアウト等の設定を受け取って反映させる役割を担っています。
Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpBase.h
リクエスト/レスポンス共通で取得できるパラメータ用のインターフェースを定義しています。
主な機能は以下の通りです。
Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpRequest.h
サーバーへの通信リクエストで使用できるパラメータ用のインターフェースを定義しています。
主な機能は以下の通りです。
リクエストのインスタンス生成に関する詳細は GenericPlatformHttp の項で説明します。
Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpResponse.h
サーバーからの通信レスポンスで使用できるパラメータ用のインターフェースを定義しています。
主な機能は以下の通りです。
Engine/Source/Runtime/Core/Public/GenericPlatform/GenericPlatformHttp.h
Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformHttp.cpp
各プラットフォーム用の静的な処理を記述するためのベースクラスです。
静的なので継承してもポリモーフィズムが適応される訳ではありませんが、
共通で処理できるものを記述するために定義されています。
FHttpModule::CreateRequest() した時には内部で FPlatformHttp::ConstructRequest() して
各プラットフォーム用のリクエストインスタンスを生成しています。
FPlatformHttp は各プラットフォーム用の FGenericPlatformHttp クラスを継承したもの(Windows なら FWindowsPlatformHttp)の typedef 定義です。
そのため、各プラットフォーム用のリクエストインスタンスを生成する場合は、
Windows なら FWindowsPlatformHttp::ConstructRequest() が実際には呼ばれ、
FCurlHttpRequest 型のリクエストインスタンスが生成されるという流れとなります。
ちなみに FCurlHttpRequest の中では curl という、
クロスプラットフォームでHTTP通信を使用するためのライブラリが使われています。
以下、wikipedia からの引用です。
libcurlはフリーであり、スレッドセーフであり、IPv6 コンパチブルである。機能は多く動作は速い。ソフトウェアプログラマはlibcurlを彼らのプログラムに組み込むことができる。40以上のプログラミング言語でlibcurlのためのバインディングが提供されている。
Engine/Source/Runtime/Online/HTTP/Public/HttpManager.h
Engine/Source/Runtime/Online/HTTP/Private/HttpManager.cpp
複数のリクエストを管理するために存在します。
IHttpRequest インスタンスがあれば通信リクエスト自体は可能ですが、
管理者がいる事で様々な機能が使えるようになっています。
また、通信リクエストは非同期で行われるため、並列処理に対するロック対応を行う必要がありますが、
HttpManager では CriticalSection に対応しているので問題ありません。
個人的には Shutdown みたいな全リクエスト一括キャンセル機能も有用だと思うので、
そういった機能を追加する際には HttpManager に追記してあげると良さそうですね。
まだまだ試していない機能(HttpRetrySystem 等)はありますが、
これで大体のHTTP通信に関する機能は網羅できたかと思います。
HTTP通信に関する実装を行うとき、何か問題が起こって調査する時にご活用下さい。