Aşağıdaki koşullar altında aşağıdaki JUnit testlerini geçen en hızlı ve en hassas boolean isReachable(String host, int port)
işlevini isterim. Zaman aşımı değerleri JUnit testinin kendisi tarafından belirlenir ve "ulaşılamaz" olarak kabul edilebilir.Java'da erişilemez bir ana bilgisayarı tespit etmenin en hızlı yolu nedir?
Lütfen dikkat: Tüm cevaplar platformdan bağımsız olmalıdır. Bu, InetAddress.isReachable(int timeout)
'un çalışmayacağı anlamına gelmez, çünkü Windows üzerinde bir ping yapmak için 7
bağlantı noktasına (Windows'da ICMP ping işlemi yapılmaz) ve bu bağlantı bu kurulumda engellenir.
LAN Kurulumu:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
) hiçbir makinenoMachine
denilen veya- her iki makina çalıştıran (her zaman ulaşılamıyor) IP
192.168.0.222
sahiptir 8080
numaralı bağlantı noktasında Apache Tomcat; Diğer tüm bağlantı noktalarıexample.com
(208.77.188.166
) portu80
bir web sunucusu çalıştıran ve LAN
Bazen internete bağlı olduğunda, yalnızca ulaşılmaktadır (port 7
dahil) ulaşılamaz, LAN bağlantısı kesilir vardır İnternette, sadece IP adresiyle çağrılan yerel makinelere ulaşılabilir (diğerlerine ulaşılamaz; DNS yoktur).
Tüm testler thisMachine
adresinde çalıştırılmaktadır. LAN internetten bağlantısı olduğunda
@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.
}
Aşağıdaki test yalnızca çalıştırılır. LAN internete bağlı olduğunda
@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.
}
Aşağıdaki test yalnızca çalıştırılır.
@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.
}