2013-05-28 58 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