概述
简介最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯,络茄网的。试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩溃。下面例子是淘宝的。
实例代码
/** * 根据IP地址获取详细的地域信息 */ public class AddressUtil { /** * @param content 请求的参数 格式为:name=xxx&pwd=xxx * @param encoding 服务器端请求编码。如GBK,UTF-8等 * @throws UnsupportedEncodingException */ public String getAddresses(String content, String encodingString) throws UnsupportedEncodingException { String urlStr = "http://ip.taobao.com/service/getIpInfo.php"; String returnStr = this.getResult(urlStr, content, encodingString); if (returnStr != null) { /* 处理返回的省市区信息 */ String[] temp = returnStr.split(","); if (temp.length < 3) { return "未知城市"; // 无效IP,局域网测试 } String province = (temp[4].split(":"))[1].replaceAll(""", ""); province = decodeUnicode(province);// 省份 if(province.equals("XX")||province==""){ province=""; }else{ province=province+"省"; } String country = (temp[2].split(":"))[1].replaceAll(""", ""); country = decodeUnicode(country);// 国家 if(country.equals("XX")||country==""){ country=""; } String city = (temp[5].split(":"))[1].replaceAll(""", ""); city = decodeUnicode(city);// 城市 if(city.equals("XX")||city==""||city.equals("内网IP")){ city=""; }else{ city=city+"市"; } String isp = (temp[7].split(":"))[1].replaceAll(""", ""); isp = decodeUnicode(isp);// ISP if(isp.equals("XX")||isp==""){ isp=""; } String str=province + city + isp; if(str.equals("")||str==""){ str=country; }else{ str=province + city+ " "+isp; } return str; } return "未知城市"; } /** * @param urlStr 请求的地址 * @param content 请求的参数 格式为:name=xxx&pwd=xxx * @param encoding 服务器端请求编码。如GBK,UTF-8等 * @return */ private String getResult(String urlStr, String content, String encoding) { URL url = null; HttpURLConnection connection = null; try { url = new URL(urlStr); connection = (HttpURLConnection) url.openConnection();/* 新建连接实例 */ connection.setConnectTimeout(2000);/* 设置连接超时时间,单位毫秒 */ connection.setReadTimeout(2000);/* 设置读取数据超时时间,单位毫秒 */ connection.setDoOutput(true);/* 是否打开输出流 true|false*/ connection.setDoInput(true);/* 是否打开输入流true|false*/ connection.setRequestMethod("POST");// 提交方法POST|GET connection.setUseCaches(false);/* 是否缓存true|false*/ connection.connect();/* 打开连接端口*/ /* 打开输出流往对端服务器写数据*/ DataOutputStream out = new DataOutputStream(connection.getOutputStream()); /* 写数据,也就是提交你的表单 name=xxx&pwd=xxx */ out.writeBytes(content); out.flush(); out.close(); /* 往对端写完数据对端服务器返回数据 */ BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream(), encoding)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); return buffer.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } } return ""; } /** * unicode 转换成 中文 * @param theString * @return */ public static String decodeUnicode(String theString) { char aChar; int len = theString.length(); StringBuffer outBuffer = new StringBuffer(len); for (int x = 0; x < len;) { aChar = theString.charAt(x++); if (aChar == '\') { aChar = theString.charAt(x++); if (aChar == 'u') { int value = 0; for (int i = 0; i < 4; i++) { aChar = theString.charAt(x++); switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + aChar - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + aChar - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + aChar - 'A'; break; default: throw new IllegalArgumentException("Malformed encoding."); } } outBuffer.append((char) value); } else { if (aChar == 't') { aChar = 't'; } else if (aChar == 'r') { aChar = 'r'; } else if (aChar == 'n') { aChar = 'n'; } else if (aChar == 'f') { aChar = 'f'; } outBuffer.append(aChar); } } else { outBuffer.append(aChar); } } return outBuffer.toString(); } /*测试 public static void main(String[] args) { AddressUtil addressUtils = new AddressUtil(); /*测试 ip 219.136.134.157 中国=华南=广东省=广州市=越秀区=电信*/ String ip = "117.135.170.150"; String address = ""; try { address = addressUtils.getAddresses("ip=" + ip, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(address); /*输出结果为:广东省,广州市,越秀区*/ } */ }
转载于:https://my.oschina.net/u/4002570/blog/2250410
最后
以上就是干净天空为你收集整理的根据IP获取地理位置的全部内容,希望文章能够帮你解决根据IP获取地理位置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复