2008-10-12 14 views
11

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 makine noMachine 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) portu 80 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. 
} 

cevap

0

Benim en son çözüm bağlantı yaparken 3000ms zaman aşımı ile TimedSocket (source code) kullanılarak bağlıdır.

Zamanlamaları:

  • 1406ms: testLocalHost()
  • 5280ms: testLAN()

bunlar bile düzgün çalışması için alınamıyor:

  • testNoDNS()
  • testHaveDNS()
0

Bunun ne kadar pratik emin değilim.

Nasıl (pencerelerde tracert) traceroute eşdeğer yapıyor ve bir başarı aldıktan sonra, başlayabilirsiniz hakkında. kurumsal ağlarda

, ben yöneticiler tarafından engellenen ICMP (ping) gördüğüm AMA genellikle tracert hala çalışıyor. Tracert ne yapmak için hızlı bir yol anlayabilirseniz, bu hile yapmalı?

İyi şanslar!

1

sen de ana bilgisayar adını ve bağlantı noktası sayısına dayalı bir URL yaratabilecek bir web sunucusuna bağlanmak olup olmadığını test etmek ve bir URLConnectionconnect method ait (istisnalar dahil) sonucu denetleme oluşturmak için bu kullanmak istiyorsanız gerektiği Web sunucusunun erişilebilir olup olmadığını söyleyin.

5

Öncelikle size potansiyel çelişkili gereksinimleri olduğunu kabul etmemiz gerekir; IP soketleri zaman belirleyici değildir. Erişilemezliği en hızlı şekilde tespit edebilmek, geçen zaman aşımınızdan sonradır. Yalnızca erişilebilirliği daha hızlı tespit edebilirsiniz. reachability varsayarsak

/isReachable gerçek amacı, sen Java Ping simülatör gösterildiği gibi, bunlar yalnızca örnek zaman hizmetine bağlanır basit engellenmeyen soket IO kullanmalıdır ancak 8080

0

üzerinde de aynı derecede çalışacak olan zamanın çok kısa sürede ana ciddi sayıda bunu yapmak gerekirse, bunu geri geldiğinde bunu exec ve çıktısını ayrıştırmak ödemek instead- fping gibi bir araç kullanarak düşünün. fping bir seferde çok sayıda paralel sorgu çalıştırır, bu yüzden bir dakika içinde birkaç bin ana bilgisayarı kontrol edebilirdiniz (limit 4096 olduğunu mu düşünüyorsunuz?)

0

Ana bilgisayar kullanılabilirliği için hız belirleme adımı kendi kodunuzun içinde değil. ama internette. Ev sahibinin yanıt vermesini beklemeniz gerekir ve bu zaman alabilir. Eğer programınız bir yanıtı beklerken engelliyorsa sorun olabilir. Her konağı bir nesne olarak, her birinin kullanılabilirliği kontrol etmek için kendi dişli yöntemiyle oluşturmasını sağladım. Kendi durumumda takip ettiğim 40 tane ev sahibim var. Ana programım, her 20 saniyede bir 40 makine nesnesinden oluşan bir dizi aracılığıyla döngüye girerek, kullanılabilirliği kontrol etmek için uygun yöntemi çağırıyor. Her makine nesne bunu yapmak için kendi iş parçacığı olarak çoğaltılır yana, 40 makineleri eş zamanlı sorgulandığı ve her biri için (en fazla 500 ms) tepki süresi bir sorun değildir.

İlgili konular