2011-08-27 3 views
0

현재 HttpComponents가 HttpRequests를 보내고 응답을 가져 오려고합니다. 대부분의 URL에서 문제없이 작동하지만 phpBB Forum의 URL을 얻으려고하면 (예 : http://www.forum.animenokami.com) 클라이언트의 시간이 더 오래 걸리며 responseEntity에 한 번 이상 구절이 포함되어 깨진 html 파일이 생성됩니다.Java : HttpComponents가 쓰레기를 가져옵니다. 특정 URL의 입력 스트림에서 응답

예를 들어 메타 태그는 6 번 포함됩니다. 다른 많은 URL이 작동하기 때문에 내가 잘못하고있는 것을 파악할 수 없습니다. 페이지가 알려진 브라우저에서 올바르게 작동하므로 문제가되지 않습니다.

다음은 내가 보내고받는 코드입니다.

 URI uri1 = new URI("http://www.forum.animenokami.com"); 
    HttpGet get = new HttpGet(uri1); 
    get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0")); 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpResponse response = httpClient.execute(get); 
    HttpEntity ent = response.getEntity(); 
    InputStream is = ent.getContent(); 
    BufferedInputStream bis = new BufferedInputStream(is); 
    byte[] tmp = new byte[2048]; 
    int l; 
    String ret = ""; 
    while ((l = bis.read(tmp)) != -1){ 
     ret += new String(tmp); 
    } 

도와 주시면 감사하겠습니다. 더 이상 필요한 정보가 있으면 가능한 한 빨리 제공하려고 노력할 것입니다.

답변

4

이 코드는 완전히 분류됩니다

String ret = ""; 
while ((l = bis.read(tmp)) != -1){ 
    ret += new String(tmp); 
} 

세 가지를 :

  • 이에 상관없이 읽은 얼마나 많은 데이터의 각 반복에 문자열로 전체 버퍼를 변환한다. (나는 이것이 실제로 당신의 경우에 잘못 될 것이라고 생각합니다.)
  • 이것은 거의 절대 좋은 생각이 아닌 기본 플랫폼 인코딩을 사용하고 있습니다.
  • 루프에서 문자열 연결을 사용 중이므로 성능이 저하됩니다. 응답에 지정된 적절한 문자 인코딩을 사용합니다

    String text = EntityUtils.toString(ent); 
    

    를, 그렇지 않은 경우는, ISO-8859-1, 그렇지

다행히 당신은 매우 쉽게 EntityUtils를 사용하여이 모두를 피할 수 있습니다. (지정되지 않은 경우 사용할 문자 인코딩을 지정할 수있는 또 다른 오버로드가 있습니다.) 보다는이 좋은 코드로 바뀌므로 원래 코드의 문제점을 이해할 가치가 있습니다. 다른 상황에서도 똑같은 실수를하지 마십시오.

+0

감사합니다. 그것은 잘 작동하지만 내가 이해하지 못하는 이유는이 URL에서만 여러 번 같은 텍스트를 볼 수 있습니다. 다른 URL 문제가 없습니다. 2048 바이트 이하가 남아 있기 때문에 전체 버퍼를 매번 변환하는 것은 마지막 바이트에만 문제가되어야합니다. 맞습니까? 버퍼의 내용도 각 반복마다 바뀌므로 출력 반복이 발생하지 않아야합니다. – TroubledMan

0

잘 작동하지만 내가 이해하지 못하는 이유는이 URL에서만 여러 번 동일한 텍스트가 나타나는 이유입니다.

클라이언트가 소켓을 읽을 때 더 많은 불완전한 버퍼가 표시되기 때문입니다. 이상이 될 수있다 :

  • 클라이언트에 원격 사이트에서 경로의 네트워크 대역폭 병목 현상이 있기 때문에,
  • 원격 사이트가 불필요한 홍조를하고 있기 때문에, 또는
  • 다른 이유.

점은 클라이언트 read 호출하여 버퍼로 읽은 바이트 수에주의해야한다 그렇지 않으면 쓰레기를 삽입 끝날 것입니다. 특히 네트워크 스트림은 버퍼를 채우지 않는 경향이 있습니다.