2011-08-27 45 views
0

我目前正試圖讓HttpComponents發送HttpRequests並檢索響應。 在大多數網址上,這個工作沒有問題,但是當我嘗試獲取phpBB論壇的URL即http://www.forum.animenokami.com時,客戶端需要更多時間,而且responseEntity包含不止一次的段落導致一個錯誤的html文件。Java:HttpComponents獲取垃圾迴應輸入來自特定URL的流

例如,meta標籤包含六次。由於許多其他URL工作,我無法弄清楚我做錯了什麼。 頁面在已知的瀏覽器中正常工作,所以它不是一個問題。

這是我用來發送和接收的代碼。

 URI uri1 = new URI("http://www.forum.animenokami.com"); 
    HttpGet get = new HttpGet(uri1); 
    get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0")); 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpResponse response = httpClient.execute(get); 
    HttpEntity ent = response.getEntity(); 
    InputStream is = ent.getContent(); 
    BufferedInputStream bis = new BufferedInputStream(is); 
    byte[] tmp = new byte[2048]; 
    int l; 
    String ret = ""; 
    while ((l = bis.read(tmp)) != -1){ 
     ret += new String(tmp); 
    } 

我希望你能幫助我。 如果您需要了解更多信息,我會盡力盡快提供。

回答

4

此代碼是完全打破:

String ret = ""; 
while ((l = bis.read(tmp)) != -1){ 
    ret += new String(tmp); 
} 

三件事:

  • 這是整個緩衝轉換成字符串在每次迭代,不管有多少數據被讀取。 (我懷疑這是你的情況實際上是錯誤的。)
  • 它使用默認的平臺編碼,這幾乎從來都不是一個好主意。
  • 它在循環中使用字符串連接,導致性能較差。

幸運的,你可以很容易使用EntityUtils避免這一切:

String text = EntityUtils.toString(ent); 

將使用在響應中規定的相應的字符編碼,如果有的話,否則ISO-8859-1。 (還有一個過載,它允許你指定,如果沒有指定它要使用的字符編碼。)

值得理解什麼是錯了你原來的代碼雖然不是只是用更好的代碼替換它,這樣你不在其他情況下不會犯同樣的錯誤。

+0

很好,謝謝。它工作正常,但我不明白的是爲什麼我只在這個URL上多次看到相同的文本。我沒有其他URL的這個問題。每次轉換整個緩衝區應該只是最後一個字節的問題,因爲剩餘的字節數少於2048個字節,對嗎? Buffer中的內容也將在每次迭代中被替換,因此不應導致輸出重複。 – TroubledMan

0

它工作正常,但我不明白的是爲什麼我只在這個URL上多次看到相同的文本。

這將是因爲您的客戶端在讀取套接字時看到更多不完整的緩衝區。比可能是:

  • 因爲從遠程站點到客戶端的路由上的網絡帶寬瓶頸,
  • 因爲遠程網站是做一些不必要的刷新,或
  • 一些其他原因。

的一點是,你的客戶必須狠抓讀入由read調用的緩衝區的字節數,否則會落得插入垃圾。特別是網絡流不容易填充緩衝區。