2013-05-28 4 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-файл после его вызова. Это то, что обмануло меня в мысли, что сущности сохраняли свой контент локально. – Maythe

Смежные вопросы