2011-07-31 5 views
3

주기적으로 서버에 액세스하여 인터넷에 연결되어 있는지 확인하는 기능이있는 Java 응용 프로그램을 작성하고 있습니다. 내 첫 번째 아이디어는 서버에 핑 (Ping)하는 것이었지만 자바로 구현하기에는 복잡했다. 그래서 HTTP 헤더 요청을 보내고 대신 HTTP 응답 코드를 확인하도록 다시 작성합니다. 두 가지 질문이 있습니다.Ping vs HTTP HEAD

1) HTTP HEAD 요청이 ping으로 "신뢰할 수있는"요청입니까? 핑 (Ping)은 내가 사용할 수있는 것이 있는지 처음으로 자연스럽게 검사 할 것입니다. 명령 행에서 실행하기가 쉽기 때문일 수도 있습니다.

2) 타사 웹 사이트에 액세스 할 수 있는지 확인하기 위해 HTTP HEAD 요청을 보내는 경우 몇 가지 표준 전송 빈도가 전송됩니까? 예를 들어 매 초마다 보내면 실망하거나 심지어는 그 서비스를 차단할 수 있습니까?

+1

"제 3 자 웹 사이트"라고 할 때, 소유하고있는 사이트입니까, 아니면 임의의 사이트입니까? 그런 다른 사람의 사이트에 핑하지 마십시오. 이로 인해 문제가 발생할 수 있습니다 (http://en.wikipedia.org/wiki/NTP_server_misuse_and_abuse). –

답변

5

일반적으로 ICMP 연결이 차단되고 HTTP가 일반적으로 열리기 때문에 HTTP HEAD는 핑보다 신뢰성이 높습니다. 매초마다 연결성을 확인하는 것은 너무 과한 것처럼 들리지만 실제로는 어떤 제 3 자 사이트를 "핑"하려고하는지 유스 케이스에 달려 있습니다.

+1

OPTIONS 요청은 먼저 검색해야 할 리소스 (예 : 길이 등)와 연결되어 있지 않기 때문에 더 좋습니다. – pyroscope

4

HEAD를 사용하는 것이 더 효과적인지 또는 시스템에 떨어 뜨리고 핑을 수행하려고 시도하는지 여부에 대해서는 언급 할 수 없습니다. 하지만 나는 그들 중 하나가 당신이해야 할 해결책이라고 생각하지 않습니다. IMHO, 연결을 폴링 할 필요는 없습니다. 연결이 끊어 질 수있는 상황이 많아서 폴링이 문제를 완화하는 데 많은 도움이 될 것이라고 생각하지 않습니다. 또한 사용자가 짜증을 낼 수도 있습니다. 나는 내가 응용 프로그램을 사용하고 다른 작업을 시작하면 갑자기 응용 프로그램에서 "제 3 자 오류로 연결이 끊어졌습니다"라는 메시지를 보았습니다. 나는 매우 짜증이났다.

응용 프로그램이 연결에 의존하는 경우 예외 처리기를 사용하여 응용 프로그램을 처리 할 수 ​​있다고 생각합니다. 어떤 API를 사용하더라도 네트워크 작업을 시도 할 때마다 예외가 발생하고 연결을 설정할 수 없다는 사실에 기꺼이 동의합니다. 그래서, 내가 무엇을 할 것이라고하는 것은 네트워크 작업을 초기화하고 어떤 클래스에,이 패러다임을 따를 것입니다 :

try { 
    performNetworkAction(); 
} catch (NoConnectionFoundException e) { 
    // handle the situation here 
} 

응용 프로그램이 연결이 끊어 때 얼마나 반응하는 방법을 결정 할 수 없어야 네트워크 작업을 시도 할 때 연결이 발견되지 않습니다.

그 말은 - 당신은 여전히 ​​나와 의견이 다를 수 있습니다. 그렇다면 허용 된/권장되는 폴링 빈도가 사용중인 서비스의 API에 문서화되어있을 수 있습니다. 또한 제 3 자의 리소스가 정적 인 경우 리소스를 반복적으로 가져 오는 대신 캐시해야합니다.

3

@Dave's answer을 확장하려고하고 의견이 충분하지 않습니다.

  1. 인터넷 연결이 끊어지면 java.io.IOException이 발생합니다. sub-classes of IOException을보십시오 - UnknownHostException, SocketException 및 ProtocolException은 "인터넷에 연결되어 있지 않습니다."라는 냄새가있는 것입니다.
  2. 예외를 처리하기위한 중앙 위치를 만듭니다 (이것은 좋은 연습입니다). 위에서 언급 한 IOException 중 하나가 발생하면 isInternetAvailable을 false로 설정하십시오.
  3. 인터넷 연결을 위해 폴링하는 대신 수행 할 작업을 다시 시도하십시오. 당신은 똑같은 것을 성취합니다.
  4. 백 오프 전략을 사용하십시오 - 지수 적 백 오프는 훌륭하게 작동합니다. 예를 들어 처음 실패한 후 5 초를 기다립니다. 두 번째 실패 후, 당신은 25 초를 기다린다. Gmail webapp는이 전략을 사용합니다.Twitter commons has utility classes for backoff.