IP工具类——IpAddress.java

根据IP地址获取详细的地域信息,也可通过 http://whois.pconline.com.cn/ 获取地址信息。

 

源码如下:(点击下载  IpAddress.java)

  1 import java.io.BufferedReader;
  2 import java.io.DataOutputStream;
  3 import java.io.IOException;
  4 import java.io.InputStreamReader;
  5 import java.io.UnsupportedEncodingException;
  6 import java.net.HttpURLConnection;
  7 import java.net.URL;
  8 
  9 /**
 10  * 根据IP地址获取详细的地域信息 
 11  *      也可通过 http://whois.pconline.com.cn/ 获取地址信息
 12  * 
 13  * 作者: zhoubang 
 14  * 日期:2015年8月7日 上午10:25:00
 15  */
 16 public class IpAddress {
 17 
 18     /**
 19      * 获取IP所在地址
 20      * 
 21      * 作者: zhoubang 
 22      * 日期:2015年8月7日 上午10:26:57
 23      * @param content
 24      * @param encodingString
 25      * @return
 26      * @throws UnsupportedEncodingException
 27      */
 28     public String getAddresses(String content, String encodingString)
 29             throws UnsupportedEncodingException {
 30         // 淘宝的接口
 31         String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
 32         String returnStr = this.getResult(urlStr, content, encodingString);
 33         if (returnStr != null) {
 34             // 处理返回的省市区信息
 35             System.out.println(returnStr);
 36             String[] temp = returnStr.split(",");
 37             if (temp.length < 3) {
 38                 return "0";// 无效IP,局域网测试
 39             }
 40             String region = (temp[5].split(":"))[1].replaceAll(""", "");
 41             region = decodeUnicode(region);// 省份
 42 
 43             String country = "";
 44             String area = "";
 45             // String region = "";
 46             String city = "";
 47             String county = "";
 48             String isp = "";
 49             for (int i = 0; i < temp.length; i++) {
 50                 switch (i) {
 51                 case 1:
 52                     country = (temp[i].split(":"))[2].replaceAll(""", "");
 53                     country = decodeUnicode(country);// 国家
 54                     break;
 55                 case 3:
 56                     area = (temp[i].split(":"))[1].replaceAll(""", "");
 57                     area = decodeUnicode(area);// 地区
 58                     break;
 59                 case 5:
 60                     region = (temp[i].split(":"))[1].replaceAll(""", "");
 61                     region = decodeUnicode(region);// 省份
 62                     break;
 63                 case 7:
 64                     city = (temp[i].split(":"))[1].replaceAll(""", "");
 65                     city = decodeUnicode(city);// 市区
 66                     break;
 67                 case 9:
 68                     county = (temp[i].split(":"))[1].replaceAll(""", "");
 69                     county = decodeUnicode(county);// 地区
 70                     break;
 71                 case 11:
 72                     isp = (temp[i].split(":"))[1].replaceAll(""", "");
 73                     isp = decodeUnicode(isp); // ISP公司
 74                     break;
 75                 }
 76             }
 77 
 78             System.out.println(country + "=" + area + "=" + region + "=" + city + "=" + county + "=" + isp);
 79             return region;
 80         }
 81         return null;
 82     }
 83 
 84     /**
 85      * 请求接口
 86      * 
 87      * 作者: zhoubang 
 88      * 日期:2015年8月7日 上午10:27:45
 89      * @param urlStr
 90      * @param content
 91      * @param encoding
 92      * @return
 93      */
 94     private String getResult(String urlStr, String content, String encoding) {
 95         URL url = null;
 96         HttpURLConnection connection = null;
 97         try {
 98             url = new URL(urlStr);
 99             connection = (HttpURLConnection) url.openConnection();// 新建连接实例
100             connection.setConnectTimeout(10000);// 设置连接超时时间,单位毫秒
101             connection.setReadTimeout(10000);// 设置读取数据超时时间,单位毫秒
102             connection.setDoOutput(true);// 是否打开输出流 true|false
103             connection.setDoInput(true);// 是否打开输入流true|false
104             connection.setRequestMethod("POST");// 提交方法POST|GET
105             connection.setUseCaches(false);// 是否缓存true|false
106             connection.connect();// 打开连接端口
107             DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据
108             out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx
109             out.flush();// 刷新
110             out.close();// 关闭输出流
111             BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
112             StringBuffer buffer = new StringBuffer();
113             String line = "";
114             while ((line = reader.readLine()) != null) {
115                 buffer.append(line);
116             }
117             reader.close();
118             return buffer.toString();
119         } catch (IOException e) {
120             e.printStackTrace();
121         } finally {
122             if (connection != null) {
123                 connection.disconnect();// 关闭连接
124             }
125         }
126         return null;
127     }
128 
129     /**
130      * unicode 转换成 中文
131      * 
132      * @author fanhui 2007-3-15
133      * @param theString
134      * @return
135      */
136     public static String decodeUnicode(String theString) {
137         char aChar;
138         int len = theString.length();
139         StringBuffer outBuffer = new StringBuffer(len);
140         for (int x = 0; x < len;) {
141             aChar = theString.charAt(x++);
142             if (aChar == '\') {
143                 aChar = theString.charAt(x++);
144                 if (aChar == 'u') {
145                     int value = 0;
146                     for (int i = 0; i < 4; i++) {
147                         aChar = theString.charAt(x++);
148                         switch (aChar) {
149                         case '0':
150                         case '1':
151                         case '2':
152                         case '3':
153                         case '4':
154                         case '5':
155                         case '6':
156                         case '7':
157                         case '8':
158                         case '9':
159                             value = (value << 4) + aChar - '0';
160                             break;
161                         case 'a':
162                         case 'b':
163                         case 'c':
164                         case 'd':
165                         case 'e':
166                         case 'f':
167                             value = (value << 4) + 10 + aChar - 'a';
168                             break;
169                         case 'A':
170                         case 'B':
171                         case 'C':
172                         case 'D':
173                         case 'E':
174                         case 'F':
175                             value = (value << 4) + 10 + aChar - 'A';
176                             break;
177                         default:
178                             throw new IllegalArgumentException("Malformed      encoding.");
179                         }
180                     }
181                     outBuffer.append((char) value);
182                 } else {
183                     if (aChar == 't') {
184                         aChar = '	';
185                     } else if (aChar == 'r') {
186                         aChar = '
';
187                     } else if (aChar == 'n') {
188                         aChar = '
';
189                     } else if (aChar == 'f') {
190                         aChar = 'f';
191                     }
192                     outBuffer.append(aChar);
193                 }
194             } else {
195                 outBuffer.append(aChar);
196             }
197         }
198         return outBuffer.toString();
199     }
200 
201     // 测试
202     public static void main(String[] args) {
203         IpAddress addressUtils = new IpAddress();
204         String ip = "27.54.227.84";
205         String address = "";
206         try {
207             address = addressUtils.getAddresses("ip=" + ip, "utf-8");
208         } catch (UnsupportedEncodingException e) {
209             e.printStackTrace();
210         }
211         System.out.println(address);
212         // 输出结果为:中国=华东=安徽省=滁州市==
213         // 安徽省
214     }
215 }
原文地址:https://www.cnblogs.com/zhoubang521/p/5200060.html