程序员在WEB开发或者其他一些开发中,经常会使用IP地址查询的功能,即通过用户的IP,去查询用户所在的地区。

本文给出一种方法,利用互联网上现有的资源,让各位可以自己实现IP地址查询的功能。

本文是教程(一),介绍的功能是如何获取本机的外网IP和地理位置,如果想知道如何获取任意IP的地理位置,请看后续教程。

读者可以先打开这个链接:http://www.ip138.com/,我们会发现有几行重要的字:

您的IP是:[131.23.132.323] 来自:xx省xx

    这个就是我们所需要的信息,我们通过浏览器查看网页源代码,结果惊奇的发现,源码里没有这一段,这是为什么?

    分析一下,网页里的内容有两个来源,一个是来自于浏览器最初从服务器获取的html源码中的内容,还有一个是浏览器加载页面之后,由页面向服务器发送请求获取的数据,既然页面源码中没有这段数据,那一定是通过AJAX请求获得的数据。

    通过抓包工具(这里用的是firebug)我们发现,其实这段信息,是在网页加载之后,页面向服务器发送的异步请求(AJAX)返回的数据。

    这个AJAX请求规格如下:

    url:http://iframe.ip138.com/ic.asp

    返回数据:


1. <html>  
2. <head>  
3. <meta http-equiv="content-type" content="text/html; charset=gb2312">  
4. <title> 您的IP地址 </title>  
5. </head>  
6. <body style="margin:0px"><center>您的IP是:[131.23.132.323] 来自:xx省xx市 电信</center></body></html>


    问题已经解决了,我们只需要向

http://iframe.ip138.com/ic.asp发送一个简单的url请求,就可以获得如上的返回数据,通过解析html源代码,取出<center>和</center>之间的部分,即可获得本机IP和地理信息:“您的IP是:[131.23.132.323] 来自:xx省xx市 电信”,再经过简单的处理,即可获得规则的IP和地址。

下面给出源码:

1. import java.io.IOException;  
2. import java.io.InputStream;  
3. import java.io.InputStreamReader;  
4. import java.net.HttpURLConnection;  
5. import java.net.URL;  
6.   
7.   
8. public class IpGetter {  
9.       
10. public static void main(String[] args) throws IOException  
11.     {  
12. new IpGetter();  
13.           
14. new IpGetter().getInfo();  
15. "不规则结果"+info);  
16.           
17.         String ip=IpGetter.getIp(info);  
18.         String address=IpGetter.getAddress(info);  
19.           
20. "IP:"+ip);  
21. "Address:"+address);  
22.     }  
23.       
24. /**
25.      * 取出ajax响应中<center>和</center>之间的部分,即为我们要的结果(不规则字符串)
26.      * @return
27.      * @throws IOException
28.      */  
29. public String getInfo() throws IOException  
30.     {  
31. "http://iframe.ip138.com/ic.asp", "gb2312");  
32. int index1=info.indexOf("<center>")+8;  
33. int index2=info.indexOf("</center>");  
34.         info=info.substring(index1,index2);  
35. return info;  
36.     }  
37.       
38. /**
39.      * 从不规则字符串中(getInfo()的结果),抽取出IP部分
40.      * @param info
41.      */  
42. public static String getIp(String info)  
43.     {  
44. int index1=info.indexOf("[")+1;  
45. int index2=info.indexOf("]");  
46.         String ip=info.substring(index1,index2);  
47. return ip;  
48.     }  
49.       
50. /**
51.      * 从不规则字符串中(getInfo()的结果),抽取出地址部分
52.      * @param info
53.      */  
54. public static String getAddress(String info)  
55.     {  
56. int index1=info.indexOf("来自:");  
57. 4);  
58. return address;  
59.     }  
60.       
61. /**
62.      * 抓取某个网页的源代码
63.      * @param urlstr 要抓取网页的地址
64.      * @param charset 网页所使用的编码 如"utf-8","gbk"
65.      * @return
66.      * @throws IOException
67.      */  
68. public  String fetchHtml(String urlstr, String charset)  
69. throws IOException {  
70. new URL(urlstr);  
71.         HttpURLConnection con = (HttpURLConnection) url.openConnection();  
72.         InputStream is = con.getInputStream();  
73. new InputStreamReader(is, charset);  
74. "";  
75. int read;  
76. while ((read = isr.read()) != -1) {  
77. char) read;  
78.         }  
79.         isr.close();  
80. return result;  
81.     }  
82.   
83. }