/** * */ package com.trendrr.oss; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.trendrr.oss.concurrent.LazyInit; import com.trendrr.oss.concurrent.TrendrrLock; /** * A simple singleton that gets your current IP address. * * Usage: * * WhatsMyIp.getIP() * * on first invocation will reach out to a webservice to get your public ip (currently uses jsonip.com) * * @author Dustin Norlander * @created Sep 21, 2011 * */ public class WhatsMyIp { protected static Log log = LogFactory.getLog(WhatsMyIp.class); protected LazyInit lock = new LazyInit(); protected int timeout = 20*1000; protected String ip = null; public static void main(String ...strings) throws IOException { System.out.println(WhatsMyIp.getIP()); System.out.println(WhatsMyIp.getIP()); System.out.println(WhatsMyIp.getIP()); System.out.println(WhatsMyIp.getIP()); System.out.println(WhatsMyIp.getIP()); } private static WhatsMyIp instance = new WhatsMyIp(); public static WhatsMyIp instance() { return instance; } public static String getIP() { return instance.getIPAddress(); } protected WhatsMyIp() { } /** * gets your current IP address, currently uses jsonip.com * * this will do one request and cache the result. * * @return your ip address as a string, or null */ public String getIPAddress() { if (lock.start()) { try { DynMap mp = DynMap.instance(this.download("http://jsonip.com")); this.ip = mp.getString("ip"); } catch (Exception x) { log.warn("Caught", x); } finally { lock.end(); } } return this.ip; } protected String download(String url) throws IOException { HttpURLConnection sourceConnection = null; BufferedInputStream inputStream = null; URL sourceURL = new URL(url); try { sourceConnection = (HttpURLConnection)sourceURL.openConnection(); sourceConnection.setConnectTimeout(timeout); sourceConnection.setReadTimeout(timeout); } catch (MalformedURLException exc) { throw new RuntimeException("Configured URL caused a MalformedURLException: ", exc); } sourceConnection.connect(); inputStream = new BufferedInputStream(sourceConnection.getInputStream()); InputStreamReader r = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(r); StringBuilder builder = new StringBuilder(); String str = ""; while (str != null) { str = reader.readLine(); if (str != null) builder.append(str); } return builder.toString(); } }