4

Android は、Apache の HTTP コンポーネント ライブラリを使用して HTTP リクエストを実行し、非同期リクエストまたはパイプライン処理をサポートしない API を公開します。パイプライン処理の恩恵を受けるアプリを作成しているので、これらのリクエストを実行するためにHotpotatoを使用しています。APK のサイズを縮小するために (Hotpotato と Netty は APK サイズに ~2 ~ 4 MB を追加します)、HttpCore と HttpNIO の上に独自の実装を検討しています。

Apache NIO 拡張機能のドキュメントには、「ノンブロッキング HTTP 接続 [は] 完全にパイプライン化可能」と言及されているパイプライン化へのあいまいな参照があり、パイプライン化のサポートに言及している HttpClient コードにバグがありますが、それを実装する方法については言及されていません。 .

Apache の HTTP コンポーネントを使用して、Android の既存の Apache HTTP コンポーネント ライブラリの上に HTTP パイプラインと永続的な接続のサポートを実装するにはどうすればよいですか?

4

1 に答える 1

3

ほとんどの場合、あなたはその答えを気に入らないでしょうが、それはそれで構いません。HTTP パイプラインのサポートが不足している理由は、HTTP パイプラインが非常に限られた数のユース ケース以外では役に立たないからです。HTTP パイプライン処理は、べき等でない HTTP メソッドにのみ適用できます (または HTTP 仕様で推奨されています)。これにより、POST リクエストのパイプライン処理が効果的に排除されます。パイプライン処理は、GET リクエストを使用して大量の静的ファイルセットを取得する必要がある一方で、 2つのみに制限されているブラウザにとって、わずかに有用です。同じホストへの同時 HTTP 接続。この場合、HTTP パイプライン処理によってパフォーマンスがわずかに向上する可能性があります。同時に、永続的な接続の適度なサイズ (5 つ以下) のプールを使用する HTTP エージェントは、パイプライン処理の HTTP エージェントよりも優れていると主張します。HTTP パイプライン処理の余分な複雑さは、トラブルに値するものではありません。これが、HttpClient と HttpCore に HTTP パイプライン処理のすぐに使えるサポートを追加する緊急性がない理由です。

HttpCore NIO のノンブロッキング HTTP 接続は完全に非同期であり、常に全二重モードで機能します。HttpCore では、書き出せるリクエストの数や一度に受信できるレスポンスの数に制限はありません。HTTP 要求と応答を論理的に関連する一連のメッセージ交換に関連付けるのは、プロトコル ハンドラーの役割です。標準の HTTP プロトコル ハンドラは、POST 要求の期待継続ハンドシェイクをサポートできるようにするために、HTTP メッセージをパイプライン処理しません (期待検証とパイプライン処理はほとんど相互に排他的です)。ただし、カスタムを構築することを妨げるものは何もありませんNHttpClientHandlerクラスを作成し、リクエストをパイプライン化します。HttpAsyncClientProtocolHandler [1] のソース コードを取得することから始めて、expect-continue ハンドシェイク コードを取り除き、受信および送信 HTTP メッセージのキューイングを追加できます。

お役に立てれば

[1] http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientProtocolHandler.java

于 2011-09-25T10:37:33.213 に答える