IP 轉換爲實際地址 《一》

項目中,有這麼一個需求,要把用戶操作操作信息做成日誌。現在要獲取用戶的登錄IP地址。並轉爲實際地址。現在給出源碼。
第一步獲取用戶登錄IP

// 獲取外網真實 IP 地址
        public static String getV4IP(HttpServletRequest request){
            String ip = "";
            String chinaz = "http://ip.chinaz.com";

            StringBuilder inputLine = new StringBuilder();
            String read = "";
            URL url = null;
            HttpURLConnection urlConnection = null;
            BufferedReader in = null;
            try {
                url = new URL(chinaz);
                urlConnection = (HttpURLConnection) url.openConnection();
                in = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
                while((read=in.readLine())!=null){
                    inputLine.append(read+"\r\n");
                }
                //System.out.println(inputLine.toString());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(in!=null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

            Pattern p = Pattern.compile("\\<dd class\\=\"fz24\">(.*?)\\<\\/dd>");
            Matcher m = p.matcher(inputLine.toString());
            if(m.find()){
                String ipstr = m.group(1);
                ip = ipstr;
                //System.out.println(ipstr);
            }
            return ip;
        }

將獲取的IP 轉換爲IP地址:

package com.whf.test;


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.URL;  
/** 
 *  根據IP地址獲取詳細的地域信息 
 *  @project:personGocheck 
 *  @class:AddressUtils.java 
 *  @author:heguanhua E-mail:[email protected] 
 *  @date:Nov 14, 2012 6:38:25 PM 
 */  
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(country+area+","+region+city+county+isp);  
            return country+area+","+region+city+county+isp;  
        }  
        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(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());// 打開輸出流往對端服務器寫數據  
            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 60.190.225.34   中國華東,浙江省杭州市電信
        String ip = "60.190.225.34";  
        String address = "";  
        try {  
            address = addressUtils.getAddresses("ip="+ip, "utf-8");  
        } catch (UnsupportedEncodingException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println(address);  
        // 中國華東,浙江省杭州市電信
    }  
}

把獲取到的IP轉爲實際地址:
IP轉爲地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章