2012-03-29 17 views
78
InetAddress byName = InetAddress.getByName("173.39.161.140"); 
    System.out.println(byName); 
    System.out.println(byName.isReachable(1000)); 

isReachablefalse क्यों लौटाता है? मैं आईपी पिंग कर सकते हैं।InetAddress.isReachable वापसी क्यों झूठी है, जब मैं आईपी पता पिंग कर सकता हूं?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/
wping आईपी से पांग के लिए इंतज़ार कर समय आ गया है, तो आप इसे इस पद्धति का उपयोग यू यह लिख सकते हैं के लिए 2000ms
सेट कर सकते हैं 4779367/समस्या-साथ-isreachable-in-inetaddress-class – assylias

+1

यह समान है। लेकिन मुझे समस्या को हल करने के लिए कोई सुराग नहीं मिला। इसलिए मैंने इसे यहां पुन: पेश किया। आपके अनुस्मारक के लिए धन्यवाद! – jiafu

+1

मैं टाइमआउट बढ़ाने की कोशिश करता हूं। – jayunit100

उत्तर

66

"isReachable" विधि कई मामलों में मेरे लिए उपयोग करने योग्य नहीं है। यदि आप ऑनलाइन हैं और बाहरी होस्ट (यानी google.com) को हल करने में सक्षम हैं, तो बस परीक्षण के लिए मेरे विकल्प को देखने के लिए नीचे स्क्रॉल कर सकते हैं ... जो आम तौर पर * NIX मशीनों पर काम करता है।

मुद्दा

बकवास की बहुत इस बारे में नहीं है:

भाग 1: समस्या

ध्यान दें कि इस मामले में, यह विफल रहता है की एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण।

 //also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd" 
     InetAddress[] addresses = InetAddress.getAllByName("www.google.com"); 
     for (InetAddress address : addresses) { 
     if (address.isReachable(10000)) 
     { 
      System.out.println("Connected "+ address); 
     } 
     else 
     { 
      System.out.println("Failed "+address); 
     } 
     } 
      //output:*Failed www.google.com/74.125.227.114* 

भाग 2: एक hackish वर्कअराउंड

एक विकल्प के रूप में, आप यह कर सकते हैं:

// in case of Linux change the 'n' to 'c' 
    Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com"); 
    int returnVal = p1.waitFor(); 
    boolean reachable = (returnVal==0); 

पिंग की -c विकल्प पिंग बस करने की कोशिश करने की अनुमति देगा एक बार सर्वर तक पहुंचें (अनंत पिंग के विपरीत जिसे हम टर्मिनल पर उपयोग करने के लिए उपयोग करते हैं)।

यह 0 लौटाएगा यदि मेजबान पहुंच योग्य है। अन्यथा, आपको वापसी मूल्य के रूप में "2" मिलेगा।

बहुत आसान - लेकिन निश्चित रूप से यह मंच विशिष्ट है। और इस आदेश का उपयोग करने के लिए कुछ विशेषाधिकार चेतावनी हो सकती हैं - लेकिन मुझे लगता है कि यह मेरी मशीनों पर काम करता है।


कृपया ध्यान दें कि: 1) यह समाधान उत्पादन गुणवत्ता नहीं है। यह एक हैक का थोड़ा सा है। यदि Google डाउन है, या आपका इंटरनेट अस्थायी रूप से धीमा है, या यहां तक ​​कि यदि आपके विशेषाधिकार/सिस्टम सेटिंग्स में कुछ मज़ेदारता है, तो भी झूठी नकारात्मक वापसी कर सकती है (यानी यह इनपुट विफल होने के बावजूद विफल हो सकता है)। 2) पहुंच योग्य विफलता एक उत्कृष्ट मुद्दा है। दोबारा - कई ऑनलाइन संसाधन बताते हैं कि इस लेखन के समय ऐसा करने का कोई "सही" तरीका नहीं है, जिस तरह से JVM मेजबान तक पहुंचने का प्रयास करता है - मुझे लगता है कि यह एक आंतरिक रूप से प्लेटफ़ॉर्म विशिष्ट कार्य है, हालांकि सरल , अभी तक JVM द्वारा पर्याप्त रूप से सारणित नहीं किया गया है।

+0

आपको बहुत धन्यवाद! – jiafu

+0

@ jayunit100 न तो दृष्टिकोण के लिए काम कर रहा है, 'पहुंच योग्य' है, मैं असफल हो रहा हूं और पिंग का उपयोग करके मुझे आईसीएमपी की अनुमति नहीं मिल रही है? क्या आप जानते हैं कि अब इससे कैसे निपटें? – Yuvi

+5

@Yuvi यदि आप विंडोज का उपयोग कर रहे हैं, तो झंडे अलग-अलग हैं। इसके बजाय -सी आप चाहते हैं। –

7

यदि आप केवल यह जांचना चाहते हैं कि यह इंटरनेट से कनेक्ट है या नहीं, तो यह सही होगा यदि इंटरनेट कनेक्ट है, तो यह बेहतर है कि आप उस साइट के पते का उपयोग करते हैं जिसे आप प्रोग्राम के माध्यम से कनेक्ट करने का प्रयास कर रहे हैं।

 public static boolean isInternetReachable() 
    { 
     try { 
      //make a URL to a known source 
      URL url = new URL("http://www.google.com"); 

      //open a connection to that source 
      HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); 

      //trying to retrieve data from the source. If there 
      //is no connection, this line will fail 
      Object objData = urlConnect.getContent(); 

     } catch (Exception e) {    
      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
+1

बेकार अगर सर्वर का कोई वेब सर्वर नहीं है, तो यह निर्दिष्ट शर्त नहीं है सवाल में बिल्कुल। –

2

अन्य उत्तरों के बाद से यह स्पष्ट रूप से इसका उल्लेख कर रहा है। IsReachable() के पिंग भाग को यूनिक्स पर रूट पहुंच की आवश्यकता है। और 4779367 में बेस्ट्सएसएस द्वारा इंगित किए गए अनुसार:

और यदि आप पूछते हैं कि बैश से पिंग क्यों नहीं है, तो वास्तव में इसकी भी आवश्यकता है। वह एलएस -एल/​​बिन/पिंग करें।

के बाद से जड़ का उपयोग कर मेरे मामले में एक विकल्प नहीं था समाधान के बाद से आप कंप्यूटर, अपने जावा पिंग कर सकते हैं विशिष्ट सर्वर मैं में दिलचस्पी थी के लिए फ़ायरवॉल में बंदरगाह 7 एक्सेस करने के लिए

-1

था। जांच करने के लिए प्रक्रिया को पर्याप्त विशेषाधिकारों के साथ चलाना चाहिए। शायद निचली सीमा में बंदरगाहों के उपयोग के कारण। यदि आप अपने जावा प्रोग्राम को सुडो/सुपरसियर के साथ चलाते हैं, तो मैं शर्त लगाता हूं कि यह काम करता है।

+0

आपको निम्न सीमा में * पोर्ट * कनेक्ट करने के लिए विशेषाधिकार की आवश्यकता नहीं है। – EJP

0

मैं सुझाव दूंगा कि इंटरनेट कनेक्शन का परीक्षण करने का एकमात्र विश्वसनीय तरीका वास्तव में फ़ाइल को कनेक्ट करना और डाउनलोड करना है, या निष्पादन() के माध्यम से ओएस पिंग कॉल के आउटपुट को पार्स करना है। आप पिंग के लिए निकास कोड पर भरोसा नहीं कर सकते हैं और पहुंच योग्य() बकवास है।

आप पिंग निकास कोड पर भरोसा नहीं कर सकते क्योंकि यह 0 लौटाता है यदि पिंग कमांड सही तरीके से निष्पादित करता है। दुर्भाग्यवश, पिंग सही तरीके से निष्पादित हो जाती है अगर यह लक्ष्य होस्ट तक नहीं पहुंच पाती है लेकिन आपके घर एडीएसएल राउटर से "गंतव्य होस्ट पहुंच योग्य" हो जाती है। यह एक ऐसा उत्तर है जिसे सफल सफल हिट के रूप में माना जाता है, इस प्रकार कोड = 0. से बाहर निकलें। हालांकि यह जोड़ना है कि यह विंडोज सिस्टम पर है। चेक नहीं * निक्स।

30

मैं इस प्रश्न के उत्तर पाने के लिए यहां आया था, लेकिन मैं किसी भी उत्तर से असंतुष्ट था क्योंकि मैं एक मंच स्वतंत्र समाधान की तलाश में था। यहां वह कोड है जिसे मैंने लिखा है और प्लेटफ़ॉर्म स्वतंत्र है, लेकिन अन्य मशीन पर किसी भी खुले बंदरगाह के बारे में जानकारी की आवश्यकता है (जिसमें हमारे पास अधिकतर समय है)।

private static boolean isReachable(String addr, int openPort, int timeOutMillis) { 
    // Any Open port on other machine 
    // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. 
    try { 
     try (Socket soc = new Socket()) { 
      soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); 
     } 
     return true; 
    } catch (IOException ex) { 
     return false; 
    } 
} 
+1

धन्यवाद, यह काम है! – Butsaty

+2

यह एक महान मंच स्वतंत्र समाधान है, धन्यवाद! – ivandov

+1

मुझे खुशी है कि मैं यहां समाप्त हुआ, सोराभ सोचने का अच्छा तरीका :) – OmarBizreh

1

मुझे यकीन है कि क्या राज्य जब मूल प्रश्न 2012

में वापस लिए कहा गया था यह अब खड़ा के रूप में, पिंग एक रूट के रूप में क्रियान्वित की जाएगी था नहीं हूँ। पिंग निष्पादन योग्य प्राधिकरण के माध्यम से आप + एस ध्वज, और रूट से संबंधित प्रक्रिया देखेंगे, जिसका अर्थ है कि यह रूट के रूप में चलाएगा। जहां ling स्थित है वहां ls -liat चलाएं और आपको इसे देखना चाहिए।

तो, यदि आप InetAddress.getByName ("www.google.com") चलाते हैं। IsReacheable (5000) रूट के रूप में, यह सच होना चाहिए।

आप रॉ सॉकेट, जो ICMP (प्रोटोकॉल पिंग द्वारा प्रयुक्त)

InetAddress.getByName पिंग के रूप में के रूप में विश्वसनीय है द्वारा किया जाता है के लिए उचित प्राधिकरण की जरूरत है, लेकिन आप इस प्रक्रिया पर उचित अनुमति की आवश्यकता इसे चलाने की है, अच्छी तरह। यदि आप व्यस्त नेटवर्क है या सिस्टम biger nping संख्या चुनें

0
private boolean isReachable(int nping, int wping, String ipping) throws Exception { 

    int nReceived = 0; 
    int nLost = 0; 

    Runtime runtime = Runtime.getRuntime(); 
    Process process = runtime.exec("ping -n " + nping + " -w " + wping + " " + ipping); 
    Scanner scanner = new Scanner(process.getInputStream()); 
    process.waitFor(); 
    ArrayList<String> strings = new ArrayList<>(); 
    String data = ""; 
    // 
    while (scanner.hasNextLine()) { 
     String string = scanner.nextLine(); 
     data = data + string + "\n"; 
     strings.add(string); 
    } 

    if (data.contains("IP address must be specified.") 
      || (data.contains("Ping request could not find host " + ipping + ".") 
      || data.contains("Please check the name and try again."))) { 
     throw new Exception(data); 
    } else if (nping > strings.size()) { 
     throw new Exception(data); 
    } 

    int index = 2; 

    for (int i = index; i < nping + index; i++) { 
     String string = strings.get(i); 
     if (string.contains("Destination host unreachable.")) { 
      nLost++; 
     } else if (string.contains("Request timed out.")) { 
      nLost++; 
     } else if (string.contains("bytes") && string.contains("time") && string.contains("TTL")) { 
      nReceived++; 
     } else { 
     } 
    } 

    return nReceived > 0; 
} 

nping, पिंग आईपी करने की कोशिश (पैकेट) की संख्या है।

isReachable(5, 2000, "192.168.7.93"); 
संबंधित मुद्दे