项目组最近添加新需求,要获取客户端和服务端IP,削微研究了一下,总结如下:
1、获取客户端外网IP(为啥不要内网,因为那玩意没鸟用,外网IP起码能确定客户端的地区位置)
目前只有一种方法可以获取:发送http请求到一个专门搞IP解析的url,通过返回的值解析出IP。这类url市面上不少,哥试了8种,没错,就是百度前三页上面所有涉及的url,响应最快返回值废话最少的是:http://ip.taobao.com/service/getIpInfo2.php?ip=myip。这里谢谢无私伟大的淘宝,希望坚持下去。
主要代码如下:
URL url = new URL("http://ip.taobao.com/service/getIpInfo2.php?ip=myip");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String str;
while ((str = br.readLine()) != null) {
sb.append(str);
}
JSONObject obj = new JSONObject(sb.toString());
String data = obj.getString("data");
JSONObject dataObj = new JSONObject(data);
String ip = dataObj.getString("ip");
br.close();
is.close();
return ip;
}
2、获取服务端IP
这个获取的方法主要是通过域名来解析,主要代码如下:
String name = "www.baidu.com";
InetAddress[] addresses = new InetAddress[0];
try {
addresses = InetAddress.getAllByName(name);
} catch (UnknownHostException e) {
e.printStackTrace();
}
for (int i = 0; i < addresses.length; i++) {
sb.append(name + "[" + i + "]: "
+ addresses[i].getHostAddress());
}
其实有这种需求的通常是做第三方sdk的,比如哥这种项目,所以最好是上面的功能都在sdk里面自己搞定,不用客户端再调个接口传个域名啥的,否则削微会影响一点体验(哥是不是考虑的有点多?)。那要怎么获取客户端代码里面的域名了,听说可以用代码注入搞定,好吧,又有得研究了。