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 = ‘\t’;
185 } else if (aChar == ‘r’) {
186 aChar = ‘\r’;
187 } else if (aChar == ‘n’) {
188 aChar = ‘\n’;
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 }