2011-04-22 4 views
0

300,000 개의 URL을 크롤링하려고합니다. 그러나 URL 중간에서 응답 코드를 검색하려고하면 코드가 중단됩니다. 나는 연결이 성립 되었기 때문에 무엇이 잘못 될지 모르지만 그 후에 문제가 발생하고있다. 나는 코드를 읽기 타임 아웃을 설정하고 제안 된대로 요청 속성을 수정했다. 그러나 이제는 코드가 응답 코드를 얻을 수 없다! 모든 제안/포인터를 크게 주시면 감사하겠습니다. 또한 특정 기간 동안 웹 사이트를 핑 (ping) 할 수있는 방법이 있습니까? 그리고 응답이 없으면 다음 웹 사이트로 진행하십시오.응답 코드를 가져올 수 없습니다! 포인터?

URL url=null; 

try 
{ 
    Thread.sleep(8000); 
} 
catch (InterruptedException e1) 
{ 
    e1.printStackTrace(); 
} 

try 
{ 
    //urlToBeCrawled comes from the database 
    url=new URL(urlToBeCrawled); 
} 
catch (MalformedURLException e) 
{ 
    e.printStackTrace(); 
//The code is in a loop,so the use of continue.I apologize for putting code in the catch block. 
    continue; 
} 
HttpURLConnection huc=null; 
try 
{ 
    huc = (HttpURLConnection)url.openConnection(); 

} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
try 
{ 
    //Added the request property 
    huc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 
    huc.setRequestMethod("HEAD"); 

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

huc.setConnectTimeout(1000); 
try 
{ 
    huc.connect(); 

    } 
catch (IOException e) 
{ 

    e.printStackTrace(); 
    continue; 
    } 

int responseCode=0; 
try 
{ 
    //Sets the read timeout 
    huc.setReadTimeout(15000); 
    //Code hangs here for some URL which is random in each run 
    responseCode = huc.getResponseCode(); 

    } 
catch (IOException e) 
{ 
    huc.disconnect(); 

    e.printStackTrace(); 
    continue; 
} 
if (responseCode!=200) 
{ 
    huc.disconnect(); 
    continue; 
} 

답변

0

응답 코드가 바이트 스트림에서 수신되지 않았기 때문에 걸려 있습니다. http 디버거를보고 실제로 무엇이 수신되었는지 확인할 수 있습니다. 그러나 서버에 대한 TCP 연결을 여는 것처럼 보였습니다. 사용자 에이전트 (사용자가 생각한 것으로 설정되지 않았을 수도 있음) 또는 요청 방법이 HEAD이거나 대역폭이 제한된 서버 일 수 있습니다. Socket 클래스를 사용하여 연결을 열고 수동으로 바이트를 준비하여 수신자/수신자가 아닌 것을 확인할 수 있습니다.

참고로 Socket만을 사용하면에 따라 실제로는 이라는 나쁜 접근 방식이 아닙니다. 이 은 http 서버 검사기를 작성하는 것처럼과 비슷합니다.이 경우 더 나은 기능과 훨씬 더 최적화 된 기술을 사용할 수 있으므로 직접 Socket을 사용하면 더 많은 기능을 사용할 수 있습니다 (많은 양의 낮은 결국 레벨 네트워크 io).

0

당신은 읽기를 설정하고 당신이 url.openConnection라는 한 후에합니다 (HttpURLConnection의에 시간 제한을 연결하는) 연결을 엽니 다

여기 내 수정 된 코드입니다. 따라서 그들은 효과가 나타나지 않습니다. 아마도 Java URL 클래스가 아니라이 목적으로 Jetty HttpClient을 사용할 것입니다.

두 번째 질문에 답변하십시오. 예, 원시 소켓을 사용하여 URL (url.getHost())에서 추출 할 수있는 원격 도메인 이름에서 포트 80 (또는 URL에 지정된 경우 다른 포트)에 대한 연결을 열려고 시도합니다. 이 일을 위해 나는 자바 소켓보다는 Netty을 사용할 것이다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것들을 들여다 볼 것이다. – collegian

관련 문제