웹 페이지를 읽고 터미널에 응답 본문을 인쇄하는 작은 명령 줄 프로그램을 작성했습니다. 이 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)
답변 해 주셔서 감사합니다. 여기에있는 질문은이 문제를 디버깅하는 방법에 관한 것입니다. 이 솔루션은 동일한 예외가 발생하지 않는 것처럼 보이지만 반환 된 모든 HTML을 인쇄하지는 않습니다. 이는 내 코드와 똑같은 양을 인쇄합니다. 웹 브라우저 또는 Wireshark에서 응답을 보면 닫기 html 태그로 응답이 완료된 것을 알 수 있습니다. – CodeBuddy