2013-02-16 20 views
6

के साथ पोर्ट निर्दिष्ट करना मैं यह निर्धारित करने के लिए इंट एड्रेस का उपयोग कर रहा हूं कि मेरा सर्वर ऑनलाइन है या नहीं।जावा एनाएड्रेस

यदि सर्वर ऑफ़लाइन है तो यह सर्वर को पुनरारंभ करेगा।

यह प्रक्रिया सर्वर पर ऑनलाइन होने पर एक बार फिर से जांचने के लिए हर 5 मिनट लूप करती है।

यह ठीक काम करता है लेकिन अब मैं निर्दिष्ट करने का तरीका है कि मैं बंदरगाह 43,594 उपयोग करना चाहते हैं जब डिफ़ॉल्ट पोर्ट 80

धन्यवाद के बजाय सर्वर की स्थिति की जांच यह पता लगाने की जरूरत है! यहाँ मेरी कोड है:

import java.net.InetAddress; 
public class Test extends Thread { 
    public static void main(String args[]) { 
     try { 
      while (true) { 
       try 
       { 
        InetAddress address = InetAddress.getByName("cloudnine1999.no-ip.org"); 
        boolean reachable = address.isReachable(10000); 
        if(reachable){ 
         System.out.println("Online"); 
        } 
        else{ 
         System.out.println("Offline: Restarting Server..."); 
         Runtime.getRuntime().exec("cmd /c start start.bat"); 
        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
       Thread.sleep(5 * 60 * 1000); 
      } 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

संपादित करें:

ठीक है तो मैं किसी के सलाह मान ली और मैं इसे इस रूप दे दिया। लेकिन अब जब मैं इस लाइन uncomment .. Runtime.getRuntime().exec("cmd /c start start.bat");

मैं इस त्रुटि मिलती है ..

error: unreported exception IOException; must be caught or declared to be thrown

यह मेरे वर्तमान कोड है:

import java.net.*; 
import java.io.*; 
public class Test extends Thread { 
    public static void main(String args[]) { 
     try { 
      while (true) { 
       SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594); 
       Socket socket = new Socket(); 
       boolean online = true; 
       try { 
        socket.connect(sockaddr, 10000); 
       } 
       catch (IOException IOException) { 
        online = false; 
     } 
       if(!online){ 
      System.out.println("OFFLINE: Restarting Server.."); 
      //Runtime.getRuntime().exec("cmd /c start start.bat"); 
     } 
       if(online){ 
        System.out.println("ONLINE"); 
       } 
       Thread.sleep(1 * 10000); 
      } 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

के लिए से निपटने: IOException की हैंडलिंग कि करीब()

EDIT3 फेंक कर सकते हैं जोड़ा क्या आपने पोर्ट को शामिल करने के लिए होस्ट पैरामीटर को संशोधित करने का प्रयास किया है? 'cloudnine1999.no-ip.org: 43594' – Vulcan

+0

[जावाडोक] (http://docs.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29) कहता है : यदि विशेषाधिकार प्राप्त किया जा सकता है, तो एक सामान्य कार्यान्वयन आईसीएमपी ईसीएचओ अनुरोधों का उपयोग करेगा, अन्यथा यह गंतव्य होस्ट के पोर्ट 7 (इको) पर एक टीसीपी कनेक्शन स्थापित करने का प्रयास करेगा। '- क्या आप सुनिश्चित हैं कि आप जिस कार्यान्वयन का उपयोग कर रहे हैं वह वास्तव में पोर्ट 80 पर टेस्टकनेक्शन का उपयोग कर रहा है? – fvu

+0

@ वल्कन धन्यवाद लेकिन मैंने कोशिश की। – Cloudnine1999

उत्तर

7

मैं पहले से ही टिप्पणी में उल्लेख किया है , Javadoc के अनुसार, पहुंच योग्य नहीं है जिस तरह से आप चयनित बंदरगाह को नियंत्रित करने की अनुमति देंगे। असल में, अगर सिस्टम विशेषाधिकारों द्वारा ऐसा करने की अनुमति है तो यह सिर्फ मशीन (आईसीएमपी अनुरोध) को पिंग करेगा।

SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594); 
// Create your socket 
Socket socket = new Socket(); 
boolean online = true; 
// Connect with 10 s timeout 
try { 
    socket.connect(sockaddr, 10000); 
} catch (SocketTimeoutException stex) { 
    // treating timeout errors separately from other io exceptions 
    // may make sense 
    online=false; 
} catch (IOException iOException) { 
    online = false;  
} finally { 
    // As the close() operation can also throw an IOException 
    // it must caught here 
    try { 
     socket.close(); 
    } catch (IOException ex) { 
     // feel free to do something moderately useful here, eg log the event 
    } 

} 
// Now, in your initial version all kinds of exceptions were swallowed by 
// that "catch (Exception e)". You also need to handle the IOException 
// exec() could throw: 
if(!online){ 
    System.out.println("OFFLINE: Restarting Server.."); 
    try { 
     Runtime.getRuntime().exec("cmd /c start start.bat"); 
    } catch (IOException ex) { 
     System.out.println("Restarting Server FAILED due to an exception " + ex.getMessage()); 
    } 
}   

संपादित करें:

इसे मैन्युअल रूप से कर (यानी, एक सॉकेट का प्रयोग करके) निश्चित रूप से काम करेंगे और वास्तव में और अधिक जटिल और/या लंबे समय तक है IOException जो भी सर्वर का मतलब है संभाल करने के लिए भूल गया है नहीं कार्य कर कहा,

EDIT2: और अपवाद कार्यकारी()

+0

धन्यवाद, यह मदद करता है लेकिन मेरे संपादन को पढ़ता है। – Cloudnine1999

+0

ओह भी socket.close() को हटाया जाना था, यह मुझे त्रुटियां भी दी। – Cloudnine1999

+0

नहीं, आपको इसे नहीं हटाया जाना चाहिए, मैंने यह दिखाने के लिए अपना कोड संशोधित किया कि इसे स्थानीय रूप से कैसे पकड़ें। आईएमओ फेंकने के अपवाद() ऑपरेशन जावा पर सबसे उपयोगी सुविधा नहीं है, लेकिन यह वही तरीका है। भ्रम के लिए खेद है, इस तरह के स्निपेट का परीक्षण करने के लिए मैंने उपयोग किए जाने वाले छोटे टेस्टप्रोग्राम में पहले से ही 'IOException' फेंकता था जो इस मुद्दे को याद करने के लिए प्रेरित था। – fvu