7

HttpURLConnection.getInputStream は、同じサーバー側サービスを使用する iPhone アプリと比較すると、非常に時間がかかります。

サービスには次のコードが使用されます。

         date= new java.util.Date();             
         Log.d("time","Time Stamp before posting  "+new Timestamp(date.getTime()));

         URL ur= new URL(url);           
         HttpURLConnection conn = (HttpURLConnection) ur.openConnection();
         conn.setRequestProperty("Connection", "close");
         conn.setReadTimeout(10000);
         conn.setConnectTimeout(15000);
         conn.setRequestMethod("POST");
         conn.setDoInput(true);
         conn.setDoOutput(true);             
         OutputStream os = conn.getOutputStream();
         BufferedWriter writer = new BufferedWriter(
                 new OutputStreamWriter(os, "UTF-8"));
         writer.write(getQuery(nameValuePairs));
         writer.close();
         os.close();
         conn.connect();

         StringBuffer response=null;             
         try{           
             Log.d("time","Time Stamp bfr InputStream  "+new Timestamp(date.getTime()));    

             InputStream is = conn.getInputStream();

             date= new java.util.Date();             
             Log.d("time","Time Stamp aftr InputStream  "+new Timestamp(date.getTime()));            

             BufferedReader rd = new BufferedReader(new InputStreamReader(is));
             String line;
             response = new StringBuffer(); 
             while((line = rd.readLine()) != null) {
                 response.append(line);
                 response.append('\r');
             }
             rd.close();
             response.toString();
             result=response.toString();

         } catch (Exception e) {

        }

サービスに時間がかかる場所を確認するために、ログ エントリを TimeStamp に出力します。

プロセスの平均時間は次のとおりです。

サーバーへの投稿にかかる平均時間は 2 ミリ秒未満
入力ストリームの作成にかかる平均時間は約 5 秒

応答を書き込む平均時間は 2 ミリ秒未満です。

入力ストリームに時間がかかり、サービス全体が非常に遅くなる理由について何か考えはありますか?

4

3 に答える 3

0

urlConnection.setConnectTimeout() をより低いタイムアウトに設定します。

URLConnection.setConnectTimeout() のクラス ドキュメントには、次のように記載されています。

接続中に待機する最大時間をミリ秒単位で設定します。接続が確立される前にタイムアウトが経過すると、サーバーへの接続は SocketTimeoutException で失敗します。デフォルト値の 0 により、ブロッキング接続が行われます。これは決してタイムアウトしないという意味ではありませんが、おそらく数分後に TCP タイムアウトが発生することを意味します。

警告: ホスト名が複数の IP アドレスに解決される場合、このクライアントは RFC 3484 の順序でそれぞれを試行します。これらの各アドレスへの接続が失敗した場合、接続試行が例外をスローする前に、複数のタイムアウトが経過します。IPv6 と IPv4 の両方をサポートするホスト名には、常に少なくとも 2 つの IP アドレスがあります。

私はもともと私のものをに設定してからurlConnection.setConnectTimeout(30000);、に変更しましたurlConnection.setConnectTimeout(1000)。すぐに、私はより速い結果を見ました。

お役に立てれば!

于 2013-11-21T13:10:16.057 に答える
0

これは、JDK 7 で導入されたバグに関連している可能性があります。見る:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8009548

目的に応じて、推奨される回避策は、HttpUrlConnection をマルチスレッド化することです。たとえば、HttpServer を使用している場合は、次のことができます。

server.setExecutor( Executors.newFixedThreadPool( 5 ) );
于 2014-03-14T03:46:28.630 に答える