2012-05-11 5 views
0

웹 페이지를 읽고 터미널에 응답 본문을 인쇄하는 작은 명령 줄 프로그램을 작성했습니다. 이 URL에서 청크 응답을 읽는 그러나 때java.io.IOException : 전송 인코딩을 읽을 때 조기 EOF : 청크 http 응답

이것은 대부분의 사이트에서 잘 작동 :이 페이지의 응답에 맞게 캐릭터 세트를 하드 코딩 한

java.io.IOException: Premature EOF 
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:538) 
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:582) 
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:669) 
at java.io.FilterInputStream.read(FilterInputStream.java:116) 
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2668) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
at java.io.InputStreamReader.read(InputStreamReader.java:167) 
at java.io.Reader.read(Reader.java:123) 
at HttpPageReader.main(HttpPageReader.java:44)` 

: 나는 다음 다시 추적을 얻을 http://www.pampers.co.uk/home. 이 문제를 디버그하기 위해 어떤 단계를 밟아야합니까? 나는 이것이 자바 버그가 아니라 웹 서버에 의해 반환 된 것과 관련된 문제라고 가정하고있다 - 그러나 나는 웹 브라우저에서 페이지를 보았고 문제없이 둘다 컬을 사용하여 그것을 다운로드했다.

코드를 다음과 같이 복사 및 붙여 넣기 및 실행 혼자 서 쉽게해야합니다 수 있습니다 :

import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.logging.Logger; 

public class HttpPageReader 
{  
private final static Logger logger = Logger.getLogger(HttpPageReader.class.getName()); 

private static final int SECOND_IN_MILLI_SECONDS = 1000; 
private static final int TIME_OUT_MILLI_SECONDS = 10 * SECOND_IN_MILLI_SECONDS; 

public static void main(String[] args) 
{ 
    if (args.length != 1) 
    { 
     logger.warning("Please provide a url to download"); 
     System.exit(1); 
    } 
    logger.info("Downloading url " + args[0] + "..."); 

    try 
    { 
     URL url = new URL(args[0]); 

     HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
     httpConn.setUseCaches(false); 
     httpConn.setRequestProperty("User-Agent", "My User Agent"); 
     httpConn.setRequestProperty("Accept", "*/*"); 
     httpConn.setConnectTimeout(TIME_OUT_MILLI_SECONDS); 
     httpConn.setReadTimeout(TIME_OUT_MILLI_SECONDS); 

     InputStreamReader inputStreamReader = new InputStreamReader(httpConn.getInputStream(), "utf-8");       
     char chars[] = new char[1000]; 
     int numRead = inputStreamReader.read(chars); 
     StringBuffer stringBuffer = new StringBuffer(); 
     while (numRead != -1) 
     { 
      stringBuffer.append(new String(chars, 0, numRead)); 
      numRead = inputStreamReader.read(chars); 
     } 

     logger.info("done");    
     logger.info(stringBuffer.toString()); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
} 

는 업데이트 : 사용 IOUtils.toString은 (httpConn.getInputStream(), "UTF-8") 제안 거의 동일한 백 트레이스를 제공합니다. 그래서 문제가 남아 있습니다.이 문제를 디버깅하려면 어떻게해야합니까?

가 제공합니다 :

java.io.IOException: Premature EOF 
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:538) 
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:582) 
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:669) 
at java.io.FilterInputStream.read(FilterInputStream.java:116) 
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2668) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
at java.io.InputStreamReader.read(InputStreamReader.java:167) 
at java.io.Reader.read(Reader.java:123) 
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1928) 
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1907) 
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1884) 
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1834) 
at org.apache.commons.io.IOUtils.toString(IOUtils.java:705) 
at org.apache.commons.io.IOUtils.toString(IOUtils.java:730) 
at HttpPageReader.main(HttpPageReader.java:40) 

답변

0

가 .....이 방법은 쉽게 ...이 시도하고 u는 정말 그들을 필요로 할 때까지 N 호 것들로 프로그램에 과부하가 그나마 기억 ......

그냥이 코드를 붙여넣고 시도해보십시오. 자신의 방식대로 수정하려고 시도하십시오 .... 행운을 빈다 !!!

package com.my; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Scanner; 

public class TestSrc { 
    public static void main(String[] args) { 
     try { 
      URL url = new URL("http://www.pampers.co.uk/home"); 
      try { 
       InputStream i = url.openStream(); 
       Scanner scan = new Scanner(i); 

       while (scan.hasNextLine()) { 
        System.out.println(scan.nextLine()); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

답변 해 주셔서 감사합니다. 여기에있는 질문은이 문제를 디버깅하는 방법에 관한 것입니다. 이 솔루션은 동일한 예외가 발생하지 않는 것처럼 보이지만 반환 된 모든 HTML을 인쇄하지는 않습니다. 이는 내 코드와 똑같은 양을 인쇄합니다. 웹 브라우저 또는 Wireshark에서 응답을 보면 닫기 html 태그로 응답이 완료된 것을 알 수 있습니다. – CodeBuddy

0

IOUtils.toString(inputStream)을 사용해 보셨습니까?

Apache Commons IOUtils

+0

또한'IOUtils.toString (inputStream, charset)' – phanneman

+0

그냥 해보 았을 때 거의 같은 백 트레이스를 얻었습니다. 세부 사항으로 질문을 업데이트 할 것입니다. – CodeBuddy

관련 문제