2009-09-18 11 views
34

मैं एक एप्लीकेशन विकसित कर रहा हूं जो सर्वर से जुड़ता है। यदि सर्वर उपलब्ध है तो अब तक लॉगिन और डेटा ट्रांसमिशन ठीक काम करता है। समस्या तब उत्पन्न होती है जब सर्वर अनुपलब्ध होता है। इस मामले में विधि एक लॉगिन अनुरोध भेजता है और प्रतिक्रिया के लिए इंतजार कर रहा है।एंड्रॉइड: यह जांचने के लिए कि सर्वर उपलब्ध है या नहीं?

क्या कोई यह जानता है कि सर्वर कैसे उपलब्ध है (दृश्यमान) है या नहीं?

  1. स्ट्रिंग serverAddress = (पढ़ें विन्यास फाइल से मूल्य) // पहले से ही
  2. बूलियन serverAvailable किया = (सर्वर अगर जाँच करें:

    सरल तर्क है कि लागू किया जाना की स्यूडोकोड पीछा कर रहा है serverAddress उपलब्ध है) // लागू किया जाना

  3. (यहाँ तर्क जो serverAvailable पर निर्भर करता है)
+0

आप यह देख सकते हैं: http://stackoverflow.com/a/18845416 ऐसा करने के लिए एक अच्छा तरीका है। (मेरी मदद की :)) – yossico

उत्तर

45

वह शायद जावा कोड की जरूरत की बात आती है जब से वह काम कर रहे ओ है है एन एंड्रॉइड। जावा समकक्ष - जो मुझे विश्वास है कि एंड्रॉइड पर काम करता है - होना चाहिए:

InetAddress.getByName(host).isReachable(timeOut) 
+29

सावधान रहें कि यह हमेशा काम नहीं करता है! [दस्तावेज़ों से] (http://developer.android.com/reference/java/net/InetAddress.html#isReachable%28int%29): "यह विधि पहले आईसीएमपी (आईसीएमपी इको अनुरोध) का उपयोग करने की कोशिश करती है। जब पहला कदम विफल रहता है, रिमोट होस्ट के पोर्ट 7 (इको) पर एक टीसीपी कनेक्शन स्थापित किया गया है। " मैंने पाया है कि कई एंड्रॉइड डिवाइस आईसीएमपी का समर्थन नहीं करते हैं, और कई सर्वर बंदरगाह 7 पर टीसीपी कनेक्शन स्वीकार नहीं करते हैं। 'पहुंच योग्य()' तो सर्वर पहुंचने के दौरान बस समय निकालता है। –

+3

यदि यह विधि काम नहीं करती है - तो आप कोशिश कर सकते हैं: http://stackoverflow.com/a/18845416 – yossico

+0

यदि आपको मुख्य थ्रेड –

2

क्या आप HTTP के साथ काम कर रहे हैं? फिर आप इस तरह के रूप में, अपने HTTP कनेक्शन पर एक टाइमआउट सेट कर सकते हैं:

private void setupHttpClient() { 
    BasicHttpParams httpParams = new BasicHttpParams(); 

    ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT); 
    //... 

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
      httpParams, schemeRegistry); 
    this.httpClient = new DefaultHttpClient(cm, httpParams); 
} 

आप तो एक अनुरोध निष्पादित हैं, तो आप दिए गए समय समाप्ति के बाद एक अपवाद मिल जाएगा।

0

ओह, नहीं, जावा में कोड काम नहीं करता है: InetAddress.getByName ("fr.yahoo.com")। पहुंच योग्य (200) हालांकि लॉगकैट में मैंने अपना आईपी पता देखा (20000 एमएस के साथ समय के बाहर)।

ऐसा लगता है कि 'पिंग' कमांड के उपयोग के लिए सुविधाजनक है उदाहरण के लिए,: एक सरल पिंग की तरह परीक्षण के साथ

 
Runtime runtime = Runtime.getRuntime(); 
Process proc = runtime.exec("ping fr.yahoo.com -c 1"); // other servers, for example 
proc.waitFor(); 
int exit = proc.exitValue(); 
if (exit == 0) { // normal exit 
    /* get output content of executing the ping command and parse it 
    * to decide if the server is reachable 
    */ 
} else { // abnormal exit, so decide that the server is not reachable 
    ... 
} 
+11

में उपयोग किया जाता है तो आपको इसे अतुल्यकालिक रूप से उपयोग करने की आवश्यकता है क्योंकि इसे एंड्रॉइड टैग किया गया है, मैं किसी को भी सहेजना चाहता हूं लिनक्स पर कच्चे सॉकेट खोलने के रूप में इसे करने का प्रयास रूट अनुमतियों की आवश्यकता है। इसलिए, यह * सबसे अप्रचलित उपकरणों पर * काम नहीं करेगा *। मैंने इसे कई एचटीसी उपकरणों को काम करने के लिए पाया है, लेकिन अन्य बस "पिंग: आईसीएमपी ओपन सॉकेट: ऑपरेशन की अनुमति नहीं है"। –

17

, यह मेरे लिए काम किया:

static public boolean isURLReachable(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnected()) { 
     try { 
      URL url = new URL("http://192.168.1.13"); // Change to "http://google.com" for www test. 
      HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
      urlc.setConnectTimeout(10 * 1000);   // 10 s. 
      urlc.connect(); 
      if (urlc.getResponseCode() == 200) {  // 200 = "OK" code (http connection is fine). 
       Log.wtf("Connection", "Success !"); 
       return true; 
      } else { 
       return false; 
      } 
     } catch (MalformedURLException e1) { 
      return false; 
     } catch (IOException e) { 
      return false; 
     } 
    } 
    return false; 
} 

नहीं इस फ़ंक्शन को थ्रेड में चलाने के लिए भूल जाएं (मुख्य धागे में नहीं)।

+0

यह मेरे लिए भी ठीक काम करता है.धन्यवाद। –

+0

क्षमा करें, मैं अभी भी एक समाधान की तलाश में था। मुझे जो पता चला है वह पृष्ठभूमि में चल रहा है, बैंडविड्थ का बहुत से उपभोग कर रहा है क्योंकि मुझे लगता है कि यह पृष्ठभूमि में समय पृष्ठ डाउनलोड कर रहा है। तो वर्तमान में पिंग प्रक्रिया के साथ अब कोशिश कर रहा है। – Ayyappa

+0

ठीक है, मैं देखता हूं, विवरण के लिए धन्यवाद। मेरे उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें, या अपना खुद का प्रदान करने के लिए स्वतंत्र महसूस करें;) –

5

आप

InetAddress.getByName(host).isReachable(timeOut) 

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

public static boolean isHostReachable(String serverAddress, int serverTCPport, int timeoutMS){ 
    boolean connected = false; 
    Socket socket; 
    try { 
     socket = new Socket(); 
     SocketAddress socketAddress = new InetSocketAddress(serverAddress, serverTCPport); 
     socket.connect(socketAddress, timeoutMS); 
     if (socket.isConnected()) { 
      connected = true; 
      socket.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     socket = null; 
    } 
    return connected; 
} 
3
public static boolean IsReachable(Context context) { 
    // First, check we have any sort of connectivity 
    final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = connMgr.getActiveNetworkInfo(); 
    boolean isReachable = false; 

    if (netInfo != null && netInfo.isConnected()) { 
     // Some sort of connection is open, check if server is reachable 
     try { 
      URL url = new URL("http://www.google.com"); 
      //URL url = new URL("http://10.0.2.2"); 
      HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
      urlc.setRequestProperty("User-Agent", "Android Application"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(10 * 1000); 
      urlc.connect(); 
      isReachable = (urlc.getResponseCode() == 200); 
     } catch (IOException e) { 
      //Log.e(TAG, e.getMessage()); 
     } 
    } 

    return isReachable; 
} 

मेरे लिए यह कोशिश, काम और actived android.permission.ACCESS_NETWORK_STATE

+1

यह मेरे साथ काम नहीं करता है। पहुंच योग्य मूल्य हमेशा झूठा है। –

+0

कृपया अपना कनेक्शन देखें या सर्वर कनेक्शन जांचें –

+0

अच्छा दिखता है। थोड़ा सा संशोधित करेगा और इसे आज़माएं। धन्यवाद –

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

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