3

Androidアプリケーション(サービス、違いが生じる場合)に永続的なHTTP 1.1接続を使用させようとすると、問題が発生します。

次のループ(簡略化されたテストケース)は、デスクトップJREでの単一のTCPセッションを介して機能しますが、Androidデバイスでは、ソケットの作成/破棄サイクル全体が発生します。

        while (true) {
            URL url;
            try {
                url = new URL("http://10.0.0.125:8080/SRV?");

                URLConnection connection = url.openConnection();

                HttpURLConnection httpConnection = (HttpURLConnection) connection;                  
                int responseCode = httpConnection.getResponseCode();

            } catch (MalformedURLException e) {
            } catch (IOException e) {
            }       
        }

OracleのJDKは、「システムプロパティ」と呼ばれるものを記述しています。

http.keepAlive =デフォルト:true

http.maxConnections =デフォルト:5

Androidのランタイムに、持続的接続を維持できないような類似点はありますか?

4

2 に答える 2

4

AndroidのJVMは、HTTP接続(java.netインターフェースを使用して行われるものでも)の内部でApache HTTPコンポーネントライブラリを使用します。そのため、動作はOracleJVMとは微妙に異なります。

理論的には、基礎となるハーモニーコードはシステムプロパティを尊重しhttp.keepAliveますが、Googleのコピーがその動作を保持するかどうかは私にはわかりません。

何が起こっているのかを完全に確認したい場合は、HttpComponentsコードを使用する必要があります。長くて苦痛ですが、 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.htmlを見ると、httpコンポーネントの接続管理アプローチの概要が示されています。HTTPコンポーネントを使用して接続管理を明示的に制御する方法について詳しく説明しているセクション2.11を参照してください。

幸運を。

于 2011-05-06T23:10:04.483 に答える
3

永続的なHTTP1.1接続が確立されていないという同じ問題が発生していました。詳細を取得するためのクイックテストアプリを作成しました。

まず、アプリからのトラフィックのTCPダンプを実行して、何が起こっているかを確認しました。「Connection:keep-alive」がサーバーに正しく送信されています。その後、サーバーは「Connection:keep-alive」で応答していました。ただし、アプリが接続のInputStreamを閉じた後、基盤となるソケットもAndroidによって閉じられました...永続化されるのではありません。

さらに深く掘り下げるために、2つの異なるアプローチを使用して接続するアプリを作成しました。

HttpURLConnection con =(HttpURLConnection)url.openConnection();

HttpClientクライアント=新しいDefaultHttpClient();

HttpClientは基盤となるソケットを永続化していないことがわかりましたが、HttpURLConnectionは永続化しています。したがって、最高のパフォーマンスが必要な場合は、AndroidがDefaultHttpClientでこのバグを解決するまで、HttpURLConnectionsを使用してください。

Android HTTP 1.1実装のバグのようですか?

于 2012-02-08T23:21:15.403 に答える