मुझे सबसे तेज़ और सबसे सटीक फ़ंक्शन boolean isReachable(String host, int port)
चाहिए जो नीचे दी गई शर्तों के तहत निम्न JUnit परीक्षण पास करता है। टाइमआउट मान JUnit परीक्षण द्वारा स्वयं निर्दिष्ट किए जाते हैं, और उन्हें "पहुंच योग्य" माना जा सकता है।जावा में पहुंचने योग्य होस्ट का पता लगाने का सबसे तेज़ तरीका क्या है?
कृपया ध्यान दें: सभी उत्तरों प्लेटफ़ॉर्म-स्वतंत्र होना चाहिए। इसका मतलब है कि InetAddress.isReachable(int timeout)
काम नहीं करेगा, क्योंकि यह पोर्ट पर एक पिंग करने के लिए पोर्ट 7
पर निर्भर करता है (आईसीएमपी पिंग विंडोज पर एक अनियंत्रित फ़ंक्शन है), और इस पोर्ट को इस सेटअप में अवरुद्ध कर दिया गया है।
लैन सेटअप:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)- कोई मशीन
noMachine
कहा जाता है या आईपी192.168.0.222
(हमेशा पहुंच योग्य नहीं) - दोनों मशीनों द्वारा चलाए जा रहे है पोर्ट
8080
पर अपाचे टॉमकैट; अन्य सभी बंदरगाहों तक नहीं पहुंचा जा example.com
(208.77.188.166
) बंदरगाह80
पर एक वेबसर्वर चल रहा है और जब लैन
कभी कभी इंटरनेट से जुड़ा है केवल पहुंचा जा सकता है है (पोर्ट 7
सहित), लैन से काट दिया जाता है इंटरनेट जिस मामले में केवल आईपी पते द्वारा बुलाया जाने वाला स्थानीय मशीन पहुंच योग्य है (अन्य सभी पहुंच योग्य नहीं हैं; कोई 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.
}