如何通过IP找到地址

发布于:2022-10-21 ⋅ 阅读:(298) ⋅ 点赞:(0)

今年为进一步规范国内的舆论控制,国家规定所有互联网平台需要显示IP归属地信息,微博、抖音、公众号等多个平台纷纷响应政策上线IP归属地功能。

那互联网平台厂商是怎么通过IP定位到我们所属地区?技术原理是什么?为小伙伴们解惑。

如何通过IP找到地址?

互联网是由多个网格组成的网络,而AS是Internet的大型网络,连接到Internet的每台计算机或设备都将连接到一个AS,每个AS都有一个编码,叫做ASN(自治网络编码)。

打个比方,可以将AS看成一个地区的快递站,快递从一个快递站到另一个快递站,直到正确的收件地区的快递站,然后快递站将在该地区派送快递,每个AS都控制一组特定的IP地址,就像快递站的快递员根据单号派送快递,通常每个AS大型公司组织

IP地址->地址块->ASN->组织->国家,通过IP地址我们可以得到一个大致的地理位置,如北京朝阳区等,另外我们可得知这个IP地址归属于编码为AS4xxx自治网络,也就是在中国,ASN编码属于中国电信。

通过用户IP获取用户地址

package com.zeyyo.product.elec.comm;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.InetAddress;

import java.net.URL;

public class AddressUtils {

 /**

  *

  * @param content

  *            请求的参数 格式为:name=xxx&pwd=xxx

  * @param encoding

  *            服务器端请求编码。如GBK,UTF-8等

  * @return

  * @throws UnsupportedEncodingException

  */  

 public String getAddresses(String content, String encodingString)  

   throws UnsupportedEncodingException {  

  // 这里调用pconline的接口  

  String urlStr = "http://ip.taobao.com/service/getIpInfo.php";  

  // 从http://whois.pconline.com.cn取得IP所在的省市区信息  

  String returnStr = this.getResult(urlStr, content, encodingString);  

  if (returnStr != null) {  

   // 处理返回的省市区信息  

   //System.out.println(returnStr);  

   String[] temp = returnStr.split(",");  

   if(temp.length<3){  

    return "0";//无效IP,局域网测试  

   }  

   String region = (temp[5].split(":"))[1].replaceAll("\"", "");  

   region = decodeUnicode(region);// 省份  

    

            String country = "";  

            String area = "";  

            // String region = "";  

            String city = "";  

            String county = "";  

            String isp = "";  

            for (int i = 0; i < temp.length; i++) {  

                switch (i) {  

                case 1:  

                    country = (temp[i].split(":"))[2].replaceAll("\"", "");  

                    country = decodeUnicode(country);// 国家  

                    break;  

                    case 3:  

                        area = (temp[i].split(":"))[1].replaceAll("\"", "");  

                        area = decodeUnicode(area);// 地区   

                    break;  

                    case 5:  

                        region = (temp[i].split(":"))[1].replaceAll("\"", "");  

                        region = decodeUnicode(region);// 省份   

                    break;   

                    case 7:  

                        city = (temp[i].split(":"))[1].replaceAll("\"", "");  

                        city = decodeUnicode(city);// 市区  

                    break;   

                    case 9:  

                            county = (temp[i].split(":"))[1].replaceAll("\"", "");  

                            county = decodeUnicode(county);// 地区   

                    break;  

                    case 11:  

                        isp = (temp[i].split(":"))[1].replaceAll("\"", "");  

                        isp = decodeUnicode(isp); // ISP公司  

                    break;  

                }  

            }  

            //System.out.println(region+city);

    //System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp);  

   return region+city;  

  }  

  return null;  

 }  

 /**

  * @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(5000);// 设置读取数据超时时间,单位毫秒  

   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());// 打开输出流往对端服务器写数据  

   out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx  

   out.flush();// 刷新  

   out.close();// 关闭输出流  

   BufferedReader reader = new BufferedReader(new InputStreamReader(  

     connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据  

   // ,以BufferedReader流来读取  

   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 null;  

 }  

 /**

  * unicode 转换成 中文

  *

  * @author fanhui 2007-3-15

  * @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) {

  AddressUtils addressUtils = new AddressUtils();  

  // 测试ip 219.136.134.157 中国=华南=广东省=广州市=越秀区=电信  

  String ip = "127.0.0.1";  

  String address = "";  

  try {  

   address = addressUtils.getAddresses("ip="+ip, "utf-8");  

  } catch (UnsupportedEncodingException e) {  

   // TODO Auto-generated catch block  

   e.printStackTrace();  

  }  

  System.out.println(address);  

  // 输出结果为:广东省,广州市,越秀区  

 }  

}


网站公告

今日签到

点亮在社区的每一天
去签到