I am using InetAddress to determine if my server is online.
If the server is offline it will restart the server.
This process loops every 5 minutes to check once again if the server is online.
It works fine but now I need to figure out how to specify that I want to use port 43594 when checking the server status instead of the default port 80.
Thanks! Here's my code:
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();
}
}
}
EDIT:
Okay so I took someones advice and I made it into this. But now when I uncomment this line..
Runtime.getRuntime().exec("cmd /c start start.bat");
I get this error..
error: unreported exception IOException; must be caught or declared to be thrown
This is my current code:
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();
}
}
}
The InetAddress class is used to encapsulate both, the numerical IP address and the domain name for that address. The InetAddress class has no visible constructors. The InetAddress class has the inability to create objects directly, hence factory methods are used for the purpose.
The getByName() method of InetAddress class determines the IP address of a host from the given host's name. If the host name is null, then an InetAddress representing an address of the loopback interface is returned.
public static InetAddress getLocalHost() throws UnknownHostException. Returns the address of the local host.
The getAddress() method of Java InetAddress class returns the raw IP address of this object.
As I already mentioned in the comments, according to the Javadoc isReachable isn't implemented in a way that would allow you to control the selected port. Actually, if it is allowed to do so by system privileges it will just ping the machine (ICMP request).
Doing it manually (ie, using a socket) will certainly work and isn't really more complicated and/or longer:
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());
}
}
EDIT: forgot to handle IOException
which also means the server isn't functioning, added
EDIT2: added the handling of the IOException that close() can throw
EDIT3: and exception handling for exec()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With