2009-07-16 46 views
35

संभव डुप्लिकेट का उपयोग कर इंटरनेट कनेक्शन का पता लगाने:
How to check if internet connection is present in java?जावा

मैं अगर किसी को भी अगर वहाँ एक इंटरनेट कनेक्शन है जब जावा का उपयोग कर पता लगाने के लिए एक आसान तरीका है देखना चाहता हूँ। वर्तमान ऐप ने विंडोज़ के लिए WinInit DLL में "InternetGetConnectedState" विधि का उपयोग किया, लेकिन मेरे ऐप को मैक ऑपरेशन के लिए क्रॉस-प्लेटफॉर्म होने की आवश्यकता है और इस तरह काम नहीं करेगा। मैं जावा में डीएलएल का उपयोग करने के लिए जेएनआई को बिल्कुल नहीं जानता और यह तेजी से निराशाजनक हो गया।

केवल एक ही तरीके से मैं सोच सकता था कि वेबसाइट पर यूआरएल कनेक्शन खोलने की कोशिश कर रहा था और यदि यह विफल हो जाता है, तो झूठी वापसी करें। मेरा दूसरा तरीका नीचे है, लेकिन मुझे नहीं पता था कि यह आम तौर पर स्थिर था या नहीं। अगर मैं अपने नेटवर्क केबल को अनप्लग करता हूं तो मुझे InetAddress बनाने का प्रयास करते समय अज्ञातहोस्ट अपवाद प्राप्त होता है। अन्यथा यदि केबल कनेक्ट है तो मुझे एक वैध InetAddress ऑब्जेक्ट मिलता है। मैंने अभी तक मैक पर नीचे दिए गए कोड का परीक्षण नहीं किया है।

आपके द्वारा प्रदान किए जा सकने वाले किसी भी उदाहरण या सलाह के लिए धन्यवाद।

अद्यतन: अंतिम कोड ब्लॉक नीचे है। मैंने एक HTTP अनुरोध (इस मामले में Google) की सलाह लेने का फैसला किया। यह आसान है और डेटा को वापस लौटने के लिए साइट पर एक अनुरोध भेजता है। अगर मुझे कनेक्शन से कोई सामग्री नहीं मिल रही है, तो कोई इंटरनेट नहीं है।

public static boolean isInternetReachable() 
     { 
      try { 

       InetAddress address = InetAddress.getByName("java.sun.com"); 

       if(address == null) 
       { 
        return false; 
       } 

      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return false; 
      } 
      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return false; 
      } 
      return true; 
     } 

अंतिम कोड ब्लॉक:

//checks for connection to the internet through dummy request 
     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 (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return false; 
      } 
      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return false; 
      } 
      return true; 
     } 

उत्तर

17

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

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

एक और दृष्टिकोण वास्तव में कुछ नेटवर्क पते पर HTTP अनुरोध को खोलना होगा जैसे कि यह हर बार अक्सर।

+0

टिप्पणी के लिए धन्यवाद। प्रतिक्रिया और विभिन्न विचारों को प्राप्त करना हमेशा अच्छा होता है। मुझे यूआरएल कनेक्शन का विचार था, या उस मामले के लिए HttpURLConnection का उपयोग करना था। मुझे पता नहीं था कि यह केवल डीएनएस परीक्षण किया गया है लेकिन मुझे इस विधि के साथ रहना पड़ सकता है। –

+0

ऊपर अंतिम कोड ब्लॉक देखें और नोट अपडेट करें। –

3

ध्यान दें कि java.sun.com प्रतिक्रिया नहीं दे रहा है तो यह झूठी वापसी कर सकता है! इस मामले में आपको निश्चित होने के लिए एक और साइट की जांच करनी चाहिए।

+0

अच्छा बिंदु। मुझे लगता है कि इस ऐप के .NET संस्करण ने ओएस के लिए डीएलएल का उपयोग क्यों किया। इस तरह ओएस तुरंत पता था कि कोई कनेक्शन था या नहीं, वेबसाइटों को पिंग नहीं करना या स्टीम की जांच करना। यह रेखा खींचने के लिए सवाल उठाएगा। एक साइट के बाद? दो? बिल्कुल मैं इनपुट क्यों चाहता था। –

2

इसका परीक्षण नहीं किया है, लेकिन मैं java.net.NetworkInterface.getNetworkInterfaces() को देखने का सुझाव देता हूं। यह मशीन पर सभी नेटवर्क इंटरफेस का एक गणना देता है, या अगर कोई नहीं है तो शून्य।

मुझे यकीन नहीं है कि यह गैर-शून्य प्रतिक्रिया मान्य नेटवर्क कनेक्शन सुनिश्चित करता है - आपकी आवश्यकताओं के आधार पर, आपको लूपबैक पते को फ़िल्टर करने की आवश्यकता हो सकती है या नहीं (जो मुझे लगता है कि आप कर सकते हैं प्रत्येक लौटा नेटवर्क इंटरफेस पर java.net.NetworkInterface.getInetAddresses() के साथ, और फिर प्रत्येक पर InetAddress.isLoopbackAddress() को कॉल करना।)

2

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

इसके अलावा, उपयोगकर्ता तक पहुंचने से पहले उपयोगकर्ता से पूछना याद रखें।

+0

एकमात्र तरीका आप निश्चित कर सकते हैं * असली * अनुरोध करना है। वास्तविक अनुरोध के लिए एक डमी अनुरोध विफल हो सकता है जब वास्तविक व्यक्ति सफल होगा, या * इसके विपरीत *। आप भविष्य की भविष्यवाणी नहीं कर सकते। – EJP

2

प्रश्न का वास्तव में कोई अर्थ नहीं है। 'इंटरनेट से कनेक्शन' जैसी कोई चीज़ नहीं है। आपको एक बनाने का प्रयास करना है। विंडोज एपीआई केवल आपको बताती है कि आपका मॉडेम डायल किया गया है या नहीं, और मैंने इसे वास्तव में देखा डायल-इन्स, जो वास्तव में विचार नहीं है। ऐसा नहीं है कि पिछले 8 सालों से मेरे पास डायल-इन है।

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। –

+1

@IanLim यहां जवाब गुवेन है 'आपको एक बनाने की कोशिश करनी है', और यह दूसरों के साथ सहमत है। – EJP

2

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

मुझे लगता है कि 80 पोर्ट के लिए एक टीसीपी कनेक्शन एक सफल कनेक्शन के बाद इसे बंद करने के लिए सबसे अच्छा समाधान होगा। यह अंतिम कोड के रूप में व्यवहार करेगा लेकिन बहुत कम यातायात होगा।

11

मुझे यह जोड़ना होगा कि ऊपर दिया गया अंतिम कोड ब्लॉक अच्छा है, लेकिन इसमें एक दोष है - निर्दिष्ट पते से संपर्क करने में बहुत लंबा समय लगाना संभव है, लेकिन पता अभी भी पहुंच योग्य है।

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

इस कारण से मैं तुम्हें यूआई धागा बंद की जाँच करने की सलाह देते हैं, और से पहले urlConnect.setConnectTimeout(1000);जोड़ने urlConnect.getContent();

इस तरह आप जानते हैं कि पता पहुंचा जा सकता है, और है कि यह 5 साल नहीं ले जाएगा बुला लिए एक 10k फ़ाइल डाउनलोड करने के लिए।

(आप निश्चित रूप से आपकी आवश्यकताओं के अनुरूप समय समाप्ति समय बदलने के लिए चाहते हो सकता है) इसके अलावा, मैं एक सामान्य पता (google.com आदि) जब तक कि आपके कार्यक्रम आम तौर पर कुछ और अधिक से अधिक तक पहुँचता जाँच नहीं की सलाह देते हैं डोमेन। यदि आप केवल एक या दो तक पहुंच रहे हैं तो उस डोमेन को चेक करें।

+0

यह माना जाना एक बहुत ही महत्वपूर्ण तथ्य है। वर्चुअल मशीन में ऐप का परीक्षण करते समय मुझे इस मुद्दे का सामना करना पड़ा। और कनेक्शन पाने के लिए उम्र ले ली। इस मामले में कनेक्शन टाइमआउट महत्वपूर्ण है। – Indigo

+0

टाइमआउट जोड़ने पर विचार करें यह कभी-कभी महत्वपूर्ण हो सकता है। – Vishrant