2013-05-28 54 views
2

我正在編寫一個Java程序,它使用Apache-HttpComponents加載頁面並將其HTML打印到控制檯;但是,該程序在拋出此錯誤之前僅打印HTML的一部分:Exception in thread "main" java.net.SocketException: socket closed.每次運行程序時,在異常之前顯示的HTML部分都完全相同,並且在Google,Yahoo和Craigslist這個簡化示例中出現錯誤:Apache-HttpComponents:套接字關閉錯誤

String USERAGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22"; 
DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet get = new HttpGet("http://www.craigslist.org"); 
get.setHeader(HTTP.USER_AGENT,USERAGENT); 
HttpResponse page = client.execute(get); 
get.releaseConnection(); 
InputStream stream = page.getEntity().getContent(); 
try{ 
    BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
    String line = ""; 
    while ((line = br.readLine()) != null){ 
     System.out.println(line); 
    } 
} 
finally{ 
    EntityUtils.consume(page.getEntity()); 
} 

回答

3

我發現get.releaseConnection();不應該叫,直到後,我已經看完了HTML。在EntityUtils.consume(page.getEntity());之後立即調用它可修復上述代碼。

+0

當然,它不應該。釋放連接然後試圖從它讀取數據從來沒有意義。太本地化了。 – EJP

+0

在我寫的早期腳本中,在調用releaseConnection()之後實際關閉連接的延遲時間足夠長,以至於實際上能夠在調用完整(儘管很小)的HTML文件後才能讀取它。這讓我誤以爲Entities在本地保存了他們的內容。 – Maythe