web-dev-qa-db-ja.com

HttpClientを使用したHTTP Postリクエストに2秒かかるのはなぜですか?

更新: 自分で答えを見つけました、以下を見てください:-)

こんにちは、

私は現在、AndroidアプリをバックグラウンドでHTTP PostとAsyncTaskを使用して送信するアプリをコーディングしています。これには org.Apache.http.client パッケージを使用します。私のコードは この例 に基づいています。

基本的に、私のコードは次のようになります。

public void postData() {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");

    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("id", "12345"));
        nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
     Log.e(TAG,e.toString());
    } catch (IOException e) {
     Log.e(TAG,e.toString());
    }
}

問題は、 httpclient.execute(..)行に1.5〜3秒ほどかかります、そして私はその理由がわかりません。 HTTP Getを使用してページを要求するだけで約80ミリ秒かかるため、問題はネットワーク遅延自体ではないようです。

問題はサーバー側にもあるようではなく、データをPOSTして http://www.disney.com/ にしてみたところ、結果は同じように遅くなりました。また、Firebugは、サーバーにローカルでデータをPOSTすると1 msの応答時間を示します。

これはエミュレーターと私のNexus Oneで起こります(両方ともAndroid 2.2)で)。

完全なコードを確認したい場合は、 GitHub に配置しました。

ボタンのプッシュでAsyncTaskを使用してバックグラウンドでHTTP Postを実行するのは、単なるダミープログラムです。それは私の最初のAndroidアプリ、そして私の最初のJava長い間コードです。そして、偶然にも、Stackoverflowに関する私の最初の質問です;-)

Httpclient.execute(httppost)に長い時間がかかる理由はありますか?

41
pableu

よし、もう少し調べて自分で解決した。次のように、HTTPバージョンを1.1に設定するパラメーターを追加するだけで済みました。

HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);

And-bookwormからの非常に素晴らしい HttpHelper Class と、試行錯誤のおかげで、これを見つけました。

私が正しく覚えている場合、HTTP 1.0はすべての要求に対して新しいTCP接続を開きます。これは大きな遅延を説明していますか?

HTTP POSTリクエストは、WLANで50〜150ミリ秒、3Gで300〜500ミリ秒かかるようになりました。

55
pableu

私はAndroidを使用していませんが、httpclient 4.0.1を使用してWindowsプラットフォームでまったく同じ種類の問題に直面しました。

HttpParams params = new BasicHttpParams();
//this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse;


HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
StringEntity entity = new StringEntity(content, "utf-8");
entity.setContentType("text/plain; charset=utf-8"); 
httpPost.setEntity(entity);

httpResponse=httpClient.execute(httpPost);

String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
httpResponse.getEntity().consumeContent();

httpClient.getConnectionManager().shutdown();
return(response);

hTTP1.1バージョンでパラメーターを設定すると問題が解決する理由がわかりません。しかしそうです。さらに奇妙なことですが、HTTP Getリクエストを実行しても症状は表示されませんでした。

とにかく、私はこれがそこに役立つことを願っています!

h

6
henri