2009-11-04 4 views
5

특정 http 요청에 대한 응답으로 얼마나 많은 데이터가 전송되었는지 알고 싶습니다. 는 내가 현재 할 것은 이것이다 :Java에서 HTTP 응답 크기 가져 오기

HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 

// 컨텐츠 크기 INT feedsize = con.getContentLength에 대한 응답()을 확인;

문제는 content-legnth가 항상 설정되지 않는다는 것입니다. 예 : 서버가 transfer-encoding = chunked를 사용하면 -1 값을 얻습니다.

내가 수행 아니요.에는 진행 정보를 표시해야합니다. 나는 그것이 완료된 후에 나에게 보내지는 데이터의 크기를 알아야한다.

배경 :이 정보는 gzip 인코딩을 사용하여 보낸 응답의 크기와 비교하기 때문에이 정보가 필요합니다. super 양식을 호출 한 후, 그들이 읽은 바이트 수와 카운터를 업데이트 할 수 있도록

답변

8

commons-io CountingInputStream을 사용하면 작업을 수행 할 수 있습니다. 충분하지만 사소한 예 :

public long countContent(URL feedurl) { 
    CountingInputStream counter = null; 
    try { 
    HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 
    counter = new CountingInputStream(con.getInputStream()); 
    String output = IOUtils.toString(counter); 
    return counter.getByteCount(); 
    } catch (IOException ex) { 
    throw new RuntimeException(ex); 
    } finally { 
    IOUtils.closeQuietly(counter); 
    } 
} 
+0

감사합니다. 그리고 maven을 사용하면 하나의 의존성이 더 이상 손상되지 않습니다 ;-) – er4z0r

2

당신은 read(), read(byte[],int,int)skip 방법을 무시 FilterInputStream 확장 할 수 있습니다.

그런 다음 URLConnection에 의해 반환 된 입력 스트림을이 중 하나와 랩핑하고 원래 스트림 대신 래퍼를 사용하십시오. 완료되면 래퍼의 카운터를 쿼리 할 수 ​​있습니다.

다른 접근 방식 (예 : 수동)은 YSlow와 같은 도구를 사용하여 브라우저에서 통계를 수집하거나 Wireshark를 사용하여 네트워크 트래픽을 검사합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 아주 좋고 게으른 코더가 아니라는 것을 인정해야한다. 나는 이것을 위해 내 자신의 바퀴/해킹을 발명하고 싶지 않다. 그러므로 실수를 피하고 시간을 절약하기 위해 Commons-io의 CountingInputStream을 기존 솔루션으로 사용할 것입니다. 시간을 내 주셔서 다시 한 번 감사드립니다. – er4z0r