2013-07-03 525 views
3

與使用相同服務器端服務的iPhone應用程序相比,HttpURLConnection.getInputStream需要非常多的時間。HttpURLConnection.getInputStream非常慢

下面的代碼被用於服務:

  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) { 

     } 

要檢查這裏的服務需要一定的時間,我把日誌條目打印時間戳。

的平均時間過程如下:

平均時間爲發佈到服務器只需不到2密耳秒
平均時間,用於創建輸入流需要近5秒鐘

平均時間寫入響應小於2密耳秒。

任何想法爲什麼輸入流花費很多時間,這使得整個服務非常慢?

回答

-1

將urlConnection.setConnectTimeout()設置爲較低的超時值。

類文檔URLConnection.setConnectTimeout()說:

以毫秒爲單位的最長等待時間,同時連接。如果在建立連接之前超時超時,連接到服務器將失敗並返回SocketTimeoutException。默認值爲0會導致我們執行阻止連接。這並不意味着我們永遠不會超時,但這可能意味着您在幾分鐘後會收到TCP超時。

警告:如果主機名解析爲多個IP地址,則此客戶端將按RFC 3484順序嘗試每個IP地址。如果連接到這些 地址中的每一個都失敗,則會在連接嘗試引發異常之前經過多個超時。支持IPv6和 IPv4的主機名始終至少有2個IP地址。

我原本把我的礦設置爲urlConnection.setConnectTimeout(30000);,然後改爲urlConnection.setConnectTimeout(1000)。馬上,我看到了更快的結果。

希望這會有所幫助!

+2

你的意思是你看到了更快的連接失敗,當你得到它們時。很難看到這是如何解決OP的問題。 – EJP

0

這可能與JDK 7中引入的錯誤有關。「使用保持活動高速緩存時,HttpServer誘發1000 ms的延遲」。請參閱:

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

根據你的目的,建議的解決方法是多線程的HttpURLConnection類。例如,如果您使用的是HttpServer,您可以執行以下操作:

server.setExecutor(Executors.newFixedThreadPool(5)); 
+0

只有當他在另一端使用'HttpServer'時。沒有證據。建議的解決方法是多線程*服務器*,這又是無關緊要的。 – EJP

1

您沒有在測量您認爲正在測量的內容。在調用getInputStream()或getResponseCode()之前,沒有任何內容會寫入服務器。所以,你真的測量:

  • 連接時間
  • 傳輸時間
  • 處理時間在服務器

,當你認爲你只是測量的getInputStream()的時間。

原因是HttpURLConnection通過緩衝所有輸出來自動設置內容長度標頭。您可以通過使用分塊傳輸模式來避免這種情況。那麼至少你會看到時間到了哪裏。

+2

我們如何做到這一點? – georgiaboy82