package net.classicube.launcher;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import javax.swing.SwingWorker;
import net.classicube.launcher.gui.ErrorScreen;
// Retrieves the client's external IP,
// to check whether server and client are located on the same machine or network.
public class GetExternalIPTask extends SwingWorker<InetAddress, Boolean> {
private static final GetExternalIPTask instance = new GetExternalIPTask();
// List of known plaintext external-IP-returning services
private static final String[] ipCheckUrls = new String[]{
"http://www.classicube.net/api/myip/", // primary
"http://curlmyip.com",
"http://www.fcraft.net/ipcheck.php"};
private GetExternalIPTask() {
}
public static GetExternalIPTask getInstance() {
return instance;
}
public static void logAndShowError(final Exception ex) {
LogUtil.getLogger().log(Level.SEVERE, "Error checking external IP address.", ex);
ErrorScreen.show("Error checking external IP address",
"An error occured while trying to look up external IP address. "
+ "You may have trouble connecting to the server if it is hosted "
+ "on the same computer, or on another computer on this network.",
ex);
}
@Override
protected InetAddress doInBackground() throws Exception {
// Try to find out external IP, by sending an HTTP request to known checking services.
// If one service is down, the next one is tried, until we're out of options.
for (final String ipCheckUrl : ipCheckUrls) {
final String ipString = HttpUtil.downloadString(ipCheckUrl);
if (ipString != null) {
try {
return InetAddress.getByName(ipString.trim());
} catch (final UnknownHostException ex) {
LogUtil.getLogger().log(Level.WARNING,
"Error parsing external IP returned from {0}: {1}",
new Object[]{ipCheckUrl, ex});
}
}
}
// None of the available services gave us a valid IP; give up
LogUtil.getLogger().log(Level.SEVERE, "Unable to determine external IP");
return null;
}
}