문제

특정 http 요청에 대한 응답으로 얼마나 많은 데이터가 전송되었는지 알고 싶습니다.내가 현재 하는 일은 이렇습니다.

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

// 컨텐츠 크기 int feedsize = con.getContentLength ()에 대한 응답을 확인합니다.

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

그래요 ~ 아니다 진행 상황 정보를 표시하려면 이것이 필요합니다.작업이 완료된 후 나에게 전송된 데이터의 크기만 알고 싶습니다.

배경:이 정보는 gzip 인코딩을 사용하여 전송된 응답의 크기와 비교하고 싶기 때문에 필요합니다.

도움이 되었습니까?

해결책

나는 a를 사용할 것이다 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);
  }
}

다른 팁

연장할 수 있습니다 FilterInputStream, 재정의 read(), read(byte[],int,int), 그리고 skip 메서드를 호출한 후 super 양식을 작성하면 읽은 바이트 수로 카운터를 업데이트합니다.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top