HTTPBestHttpに最適なプラグイン



Best Plugin Http Besthttp



64ビットIL2CPP処理をサポートするには、besthttp pro1.7.8バージョンを選択してください

http://download.csdn.NET/detail/kaitiren/9120539



Unityは、ネイティブWWWを使用するためにサーバーと通信するために使用されますが、WWWは多くの機能を提供せず、多くのニーズを満たすことができません。したがって、より多くのニーズを満たすためにHttpプロトコルをカプセル化できます。 UnityゲームでのHttpプロトコルの使用は非常に一般的です。これは、操作が簡単で、実装が簡単で、リソースのダウンロードやアップロードなどの着陸シナリオでよく使用されるためです。さらに制御を実装する場合は、Socketを使用して、独自のプロトコルを定義する必要があります。

このプラグインを使用するもう1つの鍵は、C#独自のHttpWebRequestで実装できるため、クロスプラットフォームです。



HTTPとSocketの簡単な紹介は次のとおりです。

Http接続:http接続はいわゆるショート接続です。つまり、クライアントはサーバーにリクエストを送信します。サーバーの応答が遅いと接続が切断され、ゲームでのリアルタイムデータの送信には適していません。データの量。

HTTPは各要求の後に接続をアクティブに解放するため、HTTP接続は「短い接続」です。クライアントプログラムのオンライン状態を維持するには、サーバーへの接続要求を継続的に開始する必要があります。通常は、一度にデータを取得する必要はありません。クライアントはまた、一定期間ごとに「接続の維持」要求をサーバーに送信し続けます。要求を受信した後、サーバーはクライアントに応答し、クライアントが認識されていることを示します。オンライン'。サーバーがクライアントの要求を長時間受信できない場合、クライアントは「オフライン」であると見なされます。クライアントがサーバーからの応答を長時間受信できない場合、ネットワークは切断されていると見なされます。



ソケット接続:ソケット接続は、いわゆるロング接続です。理論的には、クライアントとサーバーが接続されると、それらはアクティブに切断されませんが、さまざまな環境要因により、接続が切断される可能性があります。たとえば、サーバーまたはクライアントです。ホストがダウンしているか、ネットワークがダウンしているか、または2つの間で長期間データ転送が行われていない。ネットワークファイアウォールが接続を切断して、ネットワークリソースを解放する場合があります。したがって、ソケット接続でデータ送信がない場合、接続を維持するためにハートビートメッセージを送信する必要があります~~特定のハートビートメッセージ形式は開発者自身が定義します。

ソケット接続とHTTP接続の違いについては、以下を参照してください。

http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321826.html

http://www.xuanyusong.com/archives/1948

BestHttpは、RFC2616に基づくHttp / 1.1実装であり、Unityでサポートされているほぼすべてのモバイルおよびホストプラットフォームをサポートしています。詳細については、公式ドキュメントを参照してください。

以下の紹介は主に公式ドキュメントからのものであり、いくつかの追加情報があります。

BestHttpの目標は、Http /1.1の可能性を活用する使いやすく強力なUnityプラグインになることです。

インストール:

BestHttpディレクトリのPluginsディレクトリをAssetsディレクトリに移動する必要があります。実際、スクリプトBestHTTPInstaller.csは、インポートが完了した後、プロセスを自動的に完了します。ここでは、後で説明する[InitializeOnLoad]機能を使用します。

Unityがバージョン3.5より前の場合は、PluginsディレクトリのWP8ディレクトリを削除する必要があることに注意してください。

いくつかの基本的な紹介から始めましょう:

まず、UsingBestHttpの宣言を追加します

リクエストを取得

サーバーにリクエストを送信する最も簡単な方法は、コンストラクターにURLとコールバック関数を提供するHttpRequestオブジェクトを作成することです。新しいHttpRequestオブジェクトを作成した後、Send()関数を呼び出すだけでリクエストを送信できます。

例を見てみましょう:

1 HTTPRequest request = new HTTPRequest(new Uri(“https://google.com”), onRequestFinished) 2 request.Send() 3 void OnRequestFinished(HTTPRequest request, HTTPResponse response) 4 { 5 Debug.Log(“Request Finished! Text received: ” + response.DataAsText) 6 }

コールバック関数は2つのパラメーターを受け取ります。1つは元のHTTPRequestオブジェクトで、もう1つはサーバー応答をホストするHTTPResponseオブジェクトです。何か問題が発生した場合、HTTPResponseオブジェクトは空になり、Exceptionプロパティが表示されてエラーが表示されます。リクエストは異なるスレッドで個別に処理され、コールバック関数はUnityのメインスレッドで呼び出されるため、スレッドの同期を行う必要はありません。

この例では、一時変数は必要ありません。

new HTTPRequest(new Uri(“https://google.com”), (request, response) =>Debug.Log(“Finished!”)).Send()

POSTリクエスト

上記の例は、単純なGetリクエストです。メソッドを指定しない場合、すべてのリクエストはデフォルトでGetリクエストになります。コンストラクターには、要求メソッドを指定するパラメーターがあります。

1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”), 2 HTTPMethods.Post, 3 OnRequestFinished) 4 request.AddField(“FieldName”, “Field Value”) 5 request.Send()

データを投稿したいがドメインを設定したくない場合は、RawDataプロパティを使用できます。

1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”),HTTPMethods.Post,OnRequestFinished) 4 request.RawData = Encoding.UTF8.GetBytes('Field Value') 5 request.Send()

GETメソッドとPOSTメソッドに加えて、他のメソッドも同じように使用できます。

ダウンロードしたデータを取得する方法

通常、リクエストを通じてサーバーからデータを取得します。元のバイトデータは、HTTPResponseオブジェクトのDataプロパティを介して取得できます。画像をダウンロードする例を見てみましょう。

1 new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) => 2 { 3 var tex = new Texture2D(0, 0) 4 tex.LoadImage(response.Data) 5 guiTexture.texture = tex 6 }).Send()

もちろん、よりコンパクトなアプローチがあります。

new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) => guiTexture.texture = response.DataAsTexture2D).Send()

DataAsTexture2Dに加えて、応答をUTF8文字列に解析するためのDataAsTextプロパティもあります。

注:この記事のすべての例でエラーがチェックされているわけではありません。実稼働環境で自分でnullを追加してください。

StartCoroutineを使用してHTTPRequestを生成することもできます。

1 HTTPRequest request = new HTTPRequest(new Uri(“http://server.com”)) 2 request.Send() 3 yield return StartCoroutine(request) 4 Debug.Log(“Request finished! Downloaded Data:” + request.Response.DataAsText)

Debug.Logは、リクエストが完了した後にのみ呼び出されます。

高レベルのトピック:

BestHttpのいくつかの高次の使用法について以下で説明します。

HTTPRequestコンストラクターを使用して、一部の機能を簡単にオンまたはオフにできます。パラメータは次のとおりです。

●methodType:サーバーに何を送信するかを決定します。デフォルトのmethodType
HTTPMethods.Getです。
●isKeepAlive:連続するHtttp要求が接続を再度開く必要がないように、tcp接続を開いたままにすることをサーバーに通知します。デフォルトでオンのままにしておくと、時間を大幅に節約できます。リクエストがそれほど頻繁ではないと確信している場合は、falseに設定できます。デフォルト値はtrueです。

キープアライブに関するいくつかの情報:

http://www.cnblogs.com/huangfox/archive/2012/03/31/2426341.html

http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html

したがって、これがソケットの長い接続に置き換わるとは思わないでください。
●disableCache:キャッシュメカニズム全体を使用するかどうかをBestHttpシステムに指示します。この値がtrueの場合、システムは保存された応答をキャッシュで検索しません。
応答はキャッシュされません。デフォルトはfalseです。
検証システム

BestHTTPは、HTTPRequest認証属性を介して基本認証とダイジェスト認証をサポートします。

1 using BestHTTP.Authentication 2 var request = new HTTPRequest(new Uri('https://httpbin.org/digest-auth/auth-int/usr/paswd'), (req, resp) 3 => 4 { 5 if (resp.StatusCode != 401) 6 Debug.Log('Authenticated') 7 else 8 Debug.Log('NOT Authenticated') 9 Debug.Log(resp.DataAsText) 10 }) 11 request.Credentials = new Credentials('usr', 'paswd') 12 request.Send()

確認のために、以下を参照できます。

http://blog.csdn.net/dyllove98/article/details/9255719

ストリームメディア

HTTPRequestコンストラクターに提供するコールバック関数は、サーバーが完全なダウンロード完了プロセスに応答した後、デフォルトで1回だけ呼び出されます。このアプローチを採用すると、モバイルデバイスのメモリがすぐに使い果たされ、アプリケーションがクラッシュします。回避するために、BestHTTPはこのような問題を簡単に処理するように設計されています。フラグをtrueに設定するだけで、所定量のデータがダウンロードされるたびにコールバック関数が呼び出されます。さらに、キャッシュを閉じない場合、ダウンロードされた応答がキャッシュされるため、ローカルキャッシュから応答全体を取得でき、コードなしでサーバーにアクセスする必要はありません。 (追記:サーバーは正しいヘッダーを送信する必要があります:headers( 'Expires'
ヘッダ:)

1 var request = new HTTPRequest(new Uri('http://yourserver.com/bigfile'), (req, resp) => 2 { 3 List fragments = resp.GetStreamedFragments() 4 // Write out the downloaded data to a file: 5 using (FileStream fs = new FileStream('pathToSave', FileMode.Append)) 6 foreach(byte[] data in fragments) 7 fs.Write(data, 0, data.Length) 8 if (resp.IsStreamingFinished) 9 Debug.Log(“Download finished!”) 10 }) 11 request.UseStreaming = true 12 request.StreamFragmentSize = 1 * 1024 * 1024 // 1 megabyte 13 request.DisableCache = true // already saving to a file, so turn off caching 14 request.Send()

上記で行ったことの簡単な説明は次のとおりです。
1.フラグビット--UseStreamingをtrueに切り替えたので、コールバック関数を繰り返し呼び出すことができます。

2.StreamFragmentSizeは、コールバック関数を呼び出す前にキャッシュするデータの最大量を示します。

3.コールバック関数は、StreamFragmentSizeサイズのデータ​​ブロックがダウンロードされるたびに呼び出され、IsStreamingFinishedがtrueに設定された後に再度呼び出されます。

4.ダウンロードしたデータを取得するには、GetStreamedFragments()関数を呼び出す必要があります。呼び出しの終了後に内部キャッシュがクリアされるため、結果を一時変数に保存する必要があります。これにより、後続の呼び出しはnullを返します。

5.この例では、ダウンロードしたファイルを保存していて、あまり多くのスペースを占有したくないため、キャッシュをオフにしました。

キャッシュ

キャッシュもHTTP / 1.1RFCに基づいています。ヘッダー情報を使用して、応答を保存および検証します。キャッシュメカニズムはバックグラウンドで機能します。有効にするかどうかを決定するだけで済みます。キャッシュされた応答に将来の時刻の「Expires」ヘッダーがある場合、BestHTTPはキャッシュされた応答を使用し、サーバーに対して認証されません。これは、tcp接続を初期化する必要がないことを意味します。これにより、時間と帯域幅を節約し、オフラインで使用できます。

キャッシュは自動ですが、一部を制御したり、HTTPCacheServiceクラスのいくつかのパブリック関数を使用して一部の情報を取得したりできます。

●BeginClear():別のスレッドのすべてのキャッシュをクリアします。
●BeginMaintainence():この関数を使用すると、最新のアクセス時間に基づいてキャッシュされたエントリを削除できます。最終アクセス時刻が指定時刻より前のキャッシュエントリを削除します。この関数を使用して、キャッシュサイズを維持することもできます。
//過去2週間にアクセスされなかったキャッシュを削除してから、エントリを削除して、キャッシュサイズを50M未満に維持します。
HTTPCacheService.BeginMaintainence(new HTTPCacheMaintananceParams(TimeSpan.FromDays(14)、
50 * 1024 * 1024))
●GetCacheSize():キャッシュサイズ、バイト表現を返します

●GetCacheEntryCount():キャッシュに保存されているエントリの数を返します。平均キャッシュエントリサイズは、float avgSize = GetCacheSize()/(float)GetCacheEntryCount()として計算できます。