2012-03-04 12 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे नेटवर्क पर विशिष्ट होस्ट पहुंच योग्य हैं या नहीं। इस प्रकार मेरे जावा कोड है:जावा InetAddress.isReachable() टाइमआउट

InetAddress adr = InetAddress.getByName(host); 
if(adr.isReachable(3000)){ 
    System.out.println(host + " is reachable"); 
} 

यह काफी अच्छी तरह से काम करता है, लेकिन अगर मैं समय समाप्ति के बजाय 500ms कहना निचले हिस्से, इसे अब और होस्ट पहुंच को नामित नहीं होंगे। मैं लूप में कुछ होस्टों की जांच करने की योजना बना रहा हूं, इसलिए कम टाइमआउट होना काफी महत्वपूर्ण है। यदि मैं विंडोज कमांड लाइन से होस्ट को मैन्युअल रूप से पिंग करता हूं, तो इसमें 10ms से कम लगते हैं।

तो जावा विधि को सफल होने के लिए बहुत अधिक समय समाप्ति की आवश्यकता क्यों है? क्या isReachable() का उपयोग करने के कोई विकल्प हैं?

उत्तर

5

यह निर्भरता से आपका क्या मतलब है इस पर निर्भर करता है। यदि आप केवल विशिष्ट बंदरगाहों पर सुनने योग्य पहुंचने वाले होस्ट ढूंढते हैं, तो आप उस बंदरगाह पर सॉकेट कनेक्शन खोल सकते हैं (उदाहरण के लिए, पोर्ट 80 की जांच करके सभी HTTP सर्वर ढूंढना)। InetAddress.isReachable() का उपयोग कार्यान्वयन निर्भर है। जावाडोक के अनुसार, "एक सामान्य कार्यान्वयन आईसीएमपी इको अनुरोधों का उपयोग करेगा"। जावा एनआईओ (गैर-अवरुद्ध I/O) का उपयोग करके एक "ज्ञात बंदरगाह" चेक (जैसे http (80), smb (445), आदि) उच्च प्रदर्शन हो सकता है। मेरी कंपनी का एक उत्पाद है जो एनआईओ का उपयोग करते हुए टेलनेट या एसएसएच चलाने वाले बक्से खोजने के लिए "ज्ञात बंदरगाह" स्कैन का उपयोग करता है, और हम लगभग 5000 आईपी/सेकंड स्कैन कर सकते हैं।

+0

धन्यवाद, अनिवार्य रूप से हाँ, मैं बंदरगाहों को पोर्ट 10001 पर कनेक्ट/चेक करना चाहता हूं जिसका उपयोग उन उपकरणों द्वारा किया जाता है जिन्हें मुझे ढूंढना है। क्या आप संभवतः उस ज्ञात पोर्ट चेक को कार्यान्वित करने का उदाहरण दे सकते हैं? – Jerome

+1

ठीक है, मैं एक गैर-अवरुद्ध I/O (एनआईओ) विधि को लागू करने में नहीं जाता हूं। लेकिन मैं बस एक सॉकेट बनाउंगा। गंतव्य आईपी और पोर्ट 10001 के साथ सॉकेट एड्रेस बनाएं। फिर उपयुक्त टाइमआउट के साथ सॉकेट.कनेक्ट (सॉकेट एड्रेस, टाइमआउट) पर कॉल करें। टाइमऑट अपवाद पकड़ो। यदि सॉकेट.कनेक्ट() अपवाद के बिना लौटाता है, तो सॉकेट बंद करें, आपको पता है कि डिवाइस 10001 पर सुन रहा है। एनआईओ मॉडल के लिए, नेटटी ओपन-सोर्स प्रोजेक्ट और उदाहरणों पर एक नज़र डालें। – brettw

संबंधित मुद्दे