java 根据ip获取地址

用淘宝接口:(源码:java 根据IP地址获取地理位置)

pom.xml:

<!-- https://mvnrepository.com/artifact/net.sourceforge.jregex/jregex -->
        <dependency>
            <groupId>net.sourceforge.jregex</groupId>
            <artifactId>jregex</artifactId>
            <version>1.2_01</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

AddressUtils.java:

package com.euphe.util;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class AddressUtils {
    /**
     *
     * @param content
     *            请求的参数 格式为:name=xxx&pwd=xxx
     * @param encodingString
     *            服务器端请求编码。如GBK,UTF-8等
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String getAddresses(String content, String encodingString){
        //调用淘宝API
        String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
        String returnStr = getResult(urlStr, content,encodingString);
        if(returnStr != null){            System.out.println(returnStr);
            return  returnStr;
        }
        return null;
    }

    /**
     * @param urlStr
     *            请求的地址
     * @param content
     *            请求的参数 格式为:name=xxx&pwd=xxx
     * @param encodingString
     *            服务器端请求编码。如GBK,UTF-8等
     * @return
     */
    private static String getResult(String urlStr, String content, String encodingString) {
        URL url = null;
        HttpURLConnection connection = null;
        try {
            url = new URL(urlStr);
            // 新建连接实例
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接超时时间,单位毫秒
            //connection.setConnectTimeout(20000);
            // 设置读取数据超时时间,单位毫秒
            //connection.setReadTimeout(20000);
            //是否打开输出流
            connection.setDoOutput(true);
            //是否打开输入流
            connection.setDoInput(true);
            //提交方法 POST|GET
            connection.setRequestMethod("POST");
            //是否缓存
            connection.setUseCaches(false);
            //打开连接端口
            connection.connect();
            //打开输出流往对端服务器写数据
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
            //写数据,即提交表单 name=xxx&pwd=xxx
            out.writeBytes(content);
            //刷新
            out.flush();
            //关闭输出流
            out.close();
            // 往对端写完数据对端服务器返回数据 ,以BufferedReader流来读取
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encodingString));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null){
                buffer.append(line);
            }
            reader.close();
            return buffer.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
}

测试:

@Test
public void getAddressByIp() throws Exception {
    // 参数ip
    String ip = "219.136.134.157";
    // json_result用于接收返回的json数据
    String json_result = null;
    try {
        json_result = AddressUtils.getAddresses("ip=" + ip, "utf-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    JSONObject json = JSONObject.fromObject(json_result);
    System.out.println("json数据: " + json);
    String country = JSONObject.fromObject(json.get("data")).get("country").toString();
    String region = JSONObject.fromObject(json.get("data")).get("region").toString();
    String city = JSONObject.fromObject(json.get("data")).get("city").toString();
    String county = JSONObject.fromObject(json.get("data")).get("county").toString();
    String isp = JSONObject.fromObject(json.get("data")).get("isp").toString();
    String area = JSONObject.fromObject(json.get("data")).get("area").toString();
    System.out.println("国家: " + country);
    System.out.println("地区: " + area);
    System.out.println("省份: " + region);
    System.out.println("城市: " + city);
    System.out.println("区/县: " + county);
    System.out.println("互联网服务提供商: " + isp);  

    String address = country + "/";
    address += region + "/";
    address += city + "/";
    address += county;
    System.out.println(address);  

结果:

{"code":0,"data":{"country":"中国","country_id":"CN","area":"华南","area_id":"800000","region":"广东省","region_id":"440000","city":"广州市","city_id":"440100","county":"越秀区","county_id":"440104","isp":"电信","isp_id":"100017","ip":"219.136.134.157"}}
国家: 中国
地区: 华南
省份: 广东省
城市: 广州市
区/县: 越秀区
互联网服务提供商: 电信
中国/广东省/广州市/越秀区  

但用淘宝的API时,真的很慢,少量数据还可以,一旦数据上万,那就结束不了了,等了好久都运行不完。

没办法,开始尝试其他方法。

用【GeoLite2 City】库(源自:Java 通过Request请求获取IP地址对应省份、城市

pom.xml:

<dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.8.1</version>
        </dependency>

测试:

public static void main(String[] args) throws IOException{
      // 创建 GeoLite2 数据库
      File database = new File("/Users/admin/GeoLite2-City.mmdb");
      // 读取数据库内容
      DatabaseReader reader = new DatabaseReader.Builder(database).build();
      InetAddress ipAddress = InetAddress.getByName("171.108.233.157");     

      // 获取查询结果
      CityResponse response = null;
        try {
            response = reader.city(ipAddress);

      // 获取国家信息
      Country country = response.getCountry();
      System.out.println(country.getIsoCode());               // ‘CN‘
      System.out.println(country.getName());                  // ‘China‘
      System.out.println(country.getNames().get("zh-CN"));    // ‘中国‘

      // 获取省份
      Subdivision subdivision = response.getMostSpecificSubdivision();
      System.out.println(subdivision.getName());   // ‘Guangxi Zhuangzu Zizhiqu‘
      System.out.println(subdivision.getIsoCode()); // ‘45‘
      System.out.println(subdivision.getNames().get("zh-CN")); // ‘广西壮族自治区‘

      // 获取城市
      City city = response.getCity();
      System.out.println(city.getName()); // ‘Nanning‘
      Postal postal = response.getPostal();
      System.out.println(postal.getCode()); // ‘null‘
      System.out.println(city.getNames().get("zh-CN")); // ‘南宁‘
      Location location = response.getLocation();
      System.out.println(location.getLatitude());  // 22.8167
      System.out.println(location.getLongitude()); // 108.3167
        } catch (GeoIp2Exception e) {
            e.printStackTrace();
        }     

}  

这个就很快了,不过只能获取到城市。

原文地址:https://www.cnblogs.com/xym4869/p/8995504.html

时间: 2024-08-02 01:31:42

java 根据ip获取地址的相关文章

C#调用百度高精度IP定位API通过IP获取地址

API首页:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip 1.申请百度账号,创建应用,获取密钥(AK) http://lbsyun.baidu.com/apiconsole/key 启用服务:,可以根据自己需求来钩选,这里先全选了. 请求校验方式:IP白名单校验/SN检验,这里选择IP白名单校验.即在下面填上你访问机器的IP地址.如(114.114.114.114). 单击提交,获得AK 2.获取方式: 服务地址: http

通过ip获取地址

<?php /** * IP 地理位置查询类 * * @author 马秉尧 * @version 1.5 * @copyright 2005 CoolCode.CN */ class IpLocation { /** * QQWry.Dat文件指针 * * @var resource */ var $fp; /** * 第一条IP记录的偏移地址 * * @var int */ var $firstip; /** * 最后一条IP记录的偏移地址 * * @var int */ var $last

如何根据Ip获取地址信息--Java----待整理完善!!!

QQWry.dat数据写入方法: http://www.cnblogs.com/xumingxiang/archive/2013/02/17/2914524.html java读取QQwry.dat获得ip地址对应实际位置: http://outofmemory.cn/code-snippet/541/java-duqu-QQwry-dat-get-ip-address-duiying-shiji-position QQwry格式如下: A.文件头,共8字节 B.若干条记录的结束地址+国家和区域

Java根据IP获取国家省级地市信息

package com.ust.map; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import net.sf.json.JSONObject;public class getAddressByIP{public String getAddressByIP(){

java根据经纬度获取地址

public class GetLocation { public static void main(String[] args) { // lat 39.97646 //log 116.3039 String add = getAdd("116.3039", "39.97646"); JSONObject jsonObject = JSONObject.fromObject(add); JSONArray jsonArray = JSONArray.fromObj

java 根据经纬度获取地址

public class GetLocation { public static void main(String[] args) { // lat 39.97646 //log 116.3039 String add = getAdd("116.3039", "39.97646"); JSONObject jsonObject = JSONObject.fromObject(add); JSONArray jsonArray = JSONArray.fromObj

百度地图服务通过ip获取具体地址

//获取经纬度 var get="http://api.map.baidu.com/location/ip?ip=你的ip&ak=你的key&coor=bd09ll" 通过上面的接口可以获取IP的经纬度 //获取地址 var getaddres="http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=上面的到的经纬度&output=json&pois=

ThinkPHP使用纯真IP获取物理地址时中文乱码问题

今天在用ThinkPHP通过纯真IP获取地址时,发现输出结果中文乱码,如图: 经查发现ThinkPHP的IpLocation.class.php类文件中说明:"由于使用UTF8编码 如果使用纯真IP地址库的话 需要对返回结果进行编码转换",修改浏览器编码毕竟不是长久之计, 于是尝试通过定义一个数组编码转换方法,如图: 此时修改getArea方法代码如下: 重新运行问题解决: 原文地址:https://www.cnblogs.com/splendid/p/9574642.html

JAVA根据IP地址获取详细的地域信息

在系统中网站的头部一般都有显示是哪个城市的用户进入到网站的首页后默认城市应该是用户本地的城市信息例如北京网站就要根据你的IP地址的信息查询数据获取北京部分的数据呵呵当然我可能描述的不是很清楚但是可以理解成通过IP地址定位地理信息就行.很多人现在使用以QQ数据库为基础获取地址信息但不完整.而且不规范.互联网提供很多其他接口可以完成这项功能. 接口如下 通过淘宝IP地址库获取IP位置 1. 请求接口GEThttp://ip.taobao.com/service/getIpInfo.php?ip=[i