아래 조건에서 다음 JUnit 테스트를 통과하는 가장 빠르고 정확한 기능 boolean isReachable(String host, int port)
을 사용하고 싶습니다. 타임 아웃 값은 JUnit 테스트 자체에 의해 지정되며 "도달 할 수없는"것으로 간주 될 수 있습니다.Java에서 도달 할 수없는 호스트를 감지하는 가장 빠른 방법은 무엇입니까?
참고 : 모든 대답은 플랫폼 독립적이어야합니다. 즉, 은 포트 7
(Windows의 문서화되지 않은 기능인 ICMP 핑)에 의존하기 때문에 작동하지 않습니다.이 포트는이 설정에서 차단됩니다.
LAN 설정 :
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
) 더 기계가noMachine
라고하거나- 두 시스템이 실행 (항상 도달 할 수없는)을 IP
192.168.0.222
을 가지고 있습니다 - Apache Tomcat의 포트
8080
; 다른 모든 포트는 example.com
(208.77.188.166
는) 포트80
에 웹 서버를 실행하고 LAN이
때때로 인터넷에 연결되어있는 경우에만 연결할 수 있습니다 (포트 7
포함)에 연결할 수는 LAN이 연결되어 있지 있습니다 IP 주소로 불리는 로컬 컴퓨터 만 연결할 수있는 인터넷 (다른 모든 사용자는 연결할 수 없으며 DNS가 없습니다).
모든 테스트는 thisMachine
에서 실행됩니다. 랜이 인터넷에서을 분리 때
@Test(timeout=1600) // ~320ms per call (should be possible to do better)
public void testLocalhost() {
// We can always reach ourselves.
assertTrue(isReachable("localhost", 8080));
assertTrue(isReachable("127.0.0.1", 8080));
assertTrue(isReachable("thisMachine", 8080)); // Even if there's no DNS!
assertTrue(isReachable("192.168.0.100", 8080));
assertFalse(isReachable("localhost", 80)); // Nothing on that port.
}
@Test(timeout=5500) // ~1867ms per call (should be able to do better)
public void testLAN() {
assertTrue(isReachable("192.168.0.200", 8080)); // Always connected to the LAN.
assertFalse(isReachable("192.168.0.222", 8080)); // No such a machine.
assertFalse(isReachable("noMachine", 8080)); // No such machine.
}
다음 테스트는 실행됩니다. 랜이 인터넷에를 연결 한 경우
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testNoDNS() {
assertFalse(isReachable("otherMachine", 8080)); // No DNS.
assertFalse(isReachable("example.com", 80)); // No DNS & no Internet.
assertFalse(isReachable("208.77.188.166", 80)); // No Internet.
}
다음 테스트는 실행됩니다.
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testHaveDNS() {
assertTrue(isReachable("otherMachine", 8080)); // DNS resolves local names.
assertTrue(isReachable("example.com", 80)); // DNS available.
assertTrue(isReachable("208.77.188.166", 80)); // Internet available.
}