2013-06-17 4 views
15

से ऑनलाइन है या नहीं, मैं जांचना चाहता हूं कि सर्वर एप्लिकेशन उपलब्ध है या नहीं। सर्वर शुरू होने के बाद मैं सर्वर को स्थिति बदलने तक जांचना बंद करना चाहता हूं। मेरे कोड के साथ ऐसा कैसे करें:जांच रहा है कि सर्वर जावा कोड

private static final String SERVER_ADDRESS = "192.144.10.10"; 
    private static final int TCP_SERVER_PORT = 8890; 
    private static boolean connected = false; 
    static Socket s; 

    public static void main(String[] args) { 

    Timer timer = new Timer(); 
    timer.schedule(task, 01, 5001); } 

static TimerTask task = new TimerTask() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      if (connected == false) 
      { 
      System.out.println(hostAvailabilityCheck()); 
      } 
     } 
    }; 

    public static boolean hostAvailabilityCheck() 
    { 

     boolean available = true; 
     try {    
      if (connected == false) 
      { (s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)).close();  
      }    
      } 
     catch (UnknownHostException e) 
      { // unknown host 
      available = false; 
      s = null; 
      } 
     catch (IOException e) { // io exception, service probably not running 
      available = false; 
      s = null; 
      } 
     catch (NullPointerException e) { 
      available = false; 
      s=null; 
     } 


     return available; 
    } 

क्या इसे हल करने का कोई बेहतर तरीका है?

+1

स्थिर क्षेत्र 'connected' बहुत बेकार हो रहा है क्योंकि आप कभी नहीं इसे बदलने –

+0

खैर, यह जाँच करेगा कि क्या होस्ट/पोर्ट जोड़ी उपलब्ध है, लेकिन यह जांच नहीं करेगा कुछ भी कार्यात्मक ... यह हो सकता है कि पीछे सेवारत सॉफ्टवेयर फ्यूबर है और हमेशा HTTP के लिए 500 लौटाता है, उदाहरण के लिए – fge

+0

यह आपकी मदद कर सकता है http://stackoverflow.com/questions/9552743/proper-way-to-test-if -सर्वर-अप-इन-जावा आपका यूआरएल (URL_TO_APPLICATION) SERVER_ADDRESS + TCP_SERVER_PORT भी देख सकता है यह http://www.coderanch.com/t/205709/sockets/java/check-server –

उत्तर

2

पहले जांचें कि सर्वर चल रहा है और सर्वर कनेक्शन स्वीकार करता है।

public static boolean hostAvailabilityCheck() 
{ 
    s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT); 
    boolean available = true; 
    try {    
     if (s.isConnected()) 
     { s.close();  
     }    
     } 
    catch (UnknownHostException e) 
     { // unknown host 
     available = false; 
     s = null; 
     } 
    catch (IOException e) { // io exception, service probably not running 
     available = false; 
     s = null; 
     } 
    catch (NullPointerException e) { 
     available = false; 
     s=null; 
    } 


    return available; 
} 
+2

सभी तीन 'पकड़' ब्लॉक पर कोड समान है; इसे एक में विलय किया जा सकता है (और शायद इस मामले में होना चाहिए)। –

+6

यह मानना ​​बेहतर होगा कि सर्वर उपलब्ध नहीं है ('बूलियन उपलब्ध = झूठा'), और फिर इसे सही पर सेट करें यदि केवल और यदि आप इसे प्राप्त करने में सक्षम हैं। इस तरह, यदि कोई अपवाद है, या कुछ गड़बड़ है, तो हम अब-गलत बूलियन मान के आधार पर कनेक्ट नहीं करना जारी रखते हैं। –

+0

@AaronDigulla मुझे यकीन नहीं है कि वह जे 7 – Murali

21

जांच पद्धति के रूप में (जावा 7 और बाद में) इस प्रकार लिखा जा सकता है:

public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) { 
     return true; 
    } catch (IOException ex) { 
     /* ignore */ 
    } 
    return false; 
} 

अपवाद संचालन सरल बनाने के अलावा, यह एक परेशान करने Socket रिसाव समाप्त करता है। (आप समय इस चेक करने के लिए ले जाया के साथ संबंध रहे हैं, तो कनेक्ट करने के लिए प्रयास करने से पहले एक कनेक्शन समयबाह्य सेट करें: Setting a timeout for socket operations देखें)

लेकिन इस दृष्टिकोण के साथ समस्या कई गुना कर रहे हैं:

  • यह केवल परीक्षण है कि कुछ कनेक्शन के लिए सुन रहा है। यदि आपकी सेवा प्रॉक्सी के पीछे है ... या inetd सेवा जैसी किसी चीज़ द्वारा प्रबंधित की जाती है ... तो स्वीकृत कनेक्शन का मतलब यह नहीं है कि आपकी सेवा वास्तव में काम कर रही है।

  • यह आपकी सेवा को बिना किसी अनुरोध भेजे बंद होने वाले "देखने" कनेक्शन का कारण बनने जा रहा है। तो आप इस "कृपापूर्वक" से निपटने के लिए अपनी सेवा को बेहतर ढंग से कोड करेंगे।

  • यह बार-बार नेटवर्क और सर्वर लोड में जोड़ता है।

  • यदि आप एक छोटा टाइमआउट सेट करते हैं क्योंकि आप परीक्षण को "फ्रीज" नहीं करना चाहते हैं, तो आप इसे बहुत छोटा सेट करने का जोखिम उठाते हैं और होस्ट होने पर निर्णय लेते हैं।


के बाद सर्वर शुरू कर दिया है मैं जब तक कि सर्वर स्थिति

कि असंभव के बगल में है परिवर्तनों की जांच बंद करना चाहते हैं। इसका कारण यह है कि आप यह बताने में सक्षम नहीं होंगे कि सर्वर को जांच के बिना "बदली गई स्थिति" है या नहीं। या कम से कम, आप एक विस्तृत स्थिति अधिसूचना सेवा को लागू किए बिना ऐसा करने में सक्षम नहीं होंगे, जहां सर्वर कॉल क्लाइंट को यह बताने के लिए कहता है कि यह स्थिति बदल रहा है। (और यदि "स्थिति बदलें" में "मर" या "खोया नेटवर्क कनेक्शन" शामिल है, तो आप अधिसूचना विश्वसनीय ... अगर बिल्कुल भी नहीं कर पाएंगे।)

+0

यह विधि मेरे लिए काम नहीं करती है। मुझे कोई त्रुटि या कुछ भी प्राप्त नहीं होता है, मेरा ऐप बस "फ्रीज" जैसा कि – keinabel

+1

से पहले किया गया था मेरे अपडेट देखें .... –

+0

केवल तभी काम करता है जब सर्वर वर्तमान में –

-1

मैंने इस विधि का उपयोग मेरे लिए किया ServerUtil।

public static boolean isOnline() { 
    boolean b = true; 
    try{ 
     InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT); 
     Socket ss = new Socket(); 
     ss.connect(sa, 1); 
     ss.close(); 
    }catch(Exception e) { 
     b = false; 
    } 
    return b; 
} 
+0

कोई स्पष्टीकरण नहीं। अच्छा जवाब नहीं है। –

3
public static boolean hostAvailabilityCheck() { 
    try (Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT)) { 
     return true; 
    } catch (IOException ex) { 
     /* ignore */ 
    } 
    return false; 
} 

काम कर रहे है, लेकिन समस्या यह है कि जब आप सोचा वाई-फाई फोन पर बारी यह एक "रोते रोकने" और कोई कार्रवाई नहीं करने के लिए आता है। विचार के लिए ... =)

अगला कोड डब्ल्यूआई-एफआई के माध्यम से काम करना होगा ...यदि आप कनेक्शन के समय में वृद्धि -,

public static boolean isOnline() { 
    boolean b = true; 
    try{ 
     InetSocketAddress sa = new InetSocketAddress("SERVER_IP_ADDRESS", PORT); 
     Socket ss = new Socket(); 
     ss.connect(sa, 1);   --> change from 1 to 500 (for example) 
     ss.close(); 
    }catch(Exception e) { 
     b = false; 
    } 
    return b; 
} 
संबंधित मुद्दे