2013-05-28 1 views
2

Apache-HttpComponents를 사용하여 페이지를로드하고 해당 HTML을 콘솔에 인쇄하는 Java 프로그램을 작성 중입니다. 그러나 프로그램은이 오류를 throw하기 전에 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

나는 내가 HTML을 읽는 마친 후까지 get.releaseConnection();를 호출 할 수 없습니다 것으로 나타났습니다. EntityUtils.consume(page.getEntity()); 직후에 호출하면 위 코드가 수정됩니다.

+0

물론 그렇지 않습니다. 연결을 해제하고 그로부터 데이터를 읽으려고 시도하는 것은 결코 의미가 없었습니다. 너무 현지화되었습니다. – EJP

+0

필자가 이전에 작성한 스크립트에서 releaseConnection()이 호출 된 후 연결이 실제로 닫히는 데 걸리는 시간이 길어서 실제로 호출 한 후에 전체 (작은) HTML 파일을 읽을 수있었습니다. 이것이 엔티티가 컨텐트를 로컬에 저장했다는 것을 생각하게 만들었습니다. – Maythe