2009-03-13 3 views
8

url.openStream()에서 예외를 잡을 때 인터넷을 사용할 수 없다는 것을 어려운 방법으로 말하고 싶지 않습니다.Java로 인터넷의 가용성을 테스트하려면 어떻게해야합니까?

컴퓨터가 Java로 인터넷에 연결되어 있는지 쉽게 알 수 있습니까? 이 시나리오에서 "인터넷에 연결됨"은 특정 URL에서 데이터를 다운로드 할 수 있음을 의미합니다.

내가 다운로드하려고하는데 사용할 수없는 경우 프로그램이 약간 지연됩니다. 나는 그 교수형을 원하지 않는다. 따라서 웹 사이트의 사용 가능 여부를 쿼리하는 빠른 방법이 필요합니다.

답변

10

당신이 피하려고하는 문제는 액세스하려는 URL이 실제로 사용 불가능하다는 것을 확인하기 위해 http 연결을 기다리는 것입니다. 이를 달성하기 위해서는 openConnection(). getInputStream()에 대한 바로 가기 인 url.openStream()을 사용하지 말고 연결을 좀 더 세밀하게 제어해야합니다.연결 또는 읽기 중 하나가 당신이 timeoutMs의 paramater에서 제공하는 시간을 초과하는 경우

URLConnection conn = url.openConnection(); 
conn.setConnectTimeout(timeoutMs); 
conn.setReadTimeout(timeoutMs); 
in = conn.getInputStream(); 

이 코드는 연결 시도 시간 초과 할 수 있습니다.

+0

이것은 별도의 방법으로하지 않으면 여전히 "정지"상태가되기 때문에 이것은 평범한 해결책입니다. 실. – Chii

+0

당신은 더 나은 것을 제안 할 수 있습니까? 이미 별도의 스레드를 사용하여 데이터를 다운로드하고 있습니다. – Penchant

2

컴 포우 터가 네트워크에 연결되어 있는지 확인할 수는 있지만 네트워킹이 작동하는지 또는 인터넷에 연결되어 있다고 보장 할 수는 없더라도 알 수 있습니다.

이것은 "빨아보고"문제 중 하나입니다.

연결을 시도하면 어떤 문제가 있습니까? 그리고 그들이 인터넷에 연결되어 있는지 여부는 왜 걱정합니까?

4

"인터넷 가용성"과 같은 것은 없습니다. HTTP 요청이 투명한 HTTP 프록시를 통과한다고 생각하면 차단 목록에있는 사이트에 액세스하려고 시도하고 프록시 서버에서 액세스 거부에 대해 알려주는 HTTP 응답을받습니다. 이 시나리오에서 인터넷을 사용할 수 있습니까?

귀하의 문제에 대해 더 구체적으로 생각하십시오.

+0

이 좋은 답하고 중요한 포인트입니다. – jayunit100

0

당신은 방화벽이를 금지를하지 않습니다 경우가 NTP server를 확인할 수 있습니다

+0

많은 네트워크, 특히 기업 네트워크가 ICMP 트래픽을 차단합니다. – cletus

+0

@cletus 그는 매우 "잘 알려진"이라고 말했습니다. ICMP 트래픽을 허용하는 호스트가되어야합니다. :) – rogeriopvl

0

... 매우 잘 알려진 호스트로 ICMP 메시지를 보낼 수 있습니다.

가장 좋은 방법은 URL을 열려고 시도하는 것입니다. 왜냐하면 가장 일반적으로 열리는 서비스이기 때문입니다.

끊임없이 변화하는 하나 또는 두 개의 동적 URL을 확인할 수 있습니다. instace 들어, 시간을 보여주는 웹. 예를 들어 this one 나는 googleing을 발견했다. 사이트가 다운 될 수 있기 때문에 둘 이상이 될 수도 있습니다.

1

Java에서 사용할 수있는 저수준의 HTTP 배관에 대해서는 잘 모릅니다 만, URL에 대한 http HEAD 요청은 항상 사전에 발급 할 수 있습니다. 이로 인해 서버는 헤더가 아닌 데이터 만 되돌려 보내 게됩니다. 1 ~ 3 초 시간 제한을 설정하면 지연이 오래 걸릴 수 있습니다.

2

기준이 특정 웹 서버에 액세스 할 수 있는지 여부를 확인하는 유일한 방법은 해당 웹 서버에 액세스하는 것입니다.

그러나 시작할 때 백그라운드 스레드에서 수행 할 수 있으므로 응용 프로그램이 지연되지 않습니다. 그러면 실제 다운로드가 필요할 때 "예/아니오"대답을 사용할 수 있습니다. 사용자가 프로그램이 시작될 때 연결되어 있지 않으면 "네트워크에 연결"에 대해 사용자가 무슨 일이 일어나고 있는지 알지 못하도록 메시지를 상태 표시 줄에 넣으십시오.

1

다운로드를 기다리는 동안 프로그램이 중단 된 경우 GUI 스레드를 사용하여 다운로드 할 수 있습니다. 백그라운드 스레드를 사용하면 타임 아웃/다운로드에 시간이 오래 걸리는 경우에도 프로그램이 중단되지 않습니다.

5

사용

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com"); 
System.out.println(p1.waitFor()); 
// return code for p1 will be 0 if internet is connected, else it will be 1 
+0

Naga Rishi. 고맙습니다. 좋은 답변. – pudaykiran

관련 문제