閱讀718 返回首頁    go 阿裏雲 go 技術社區[雲棲]


獲取本機外網IP地址(External IP Address)示例

原文:https://www.cnblogs.com/Csharpblogs/articles/2218156.html

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 獲取本機外網IP地址
 * 思想是訪問網站https://checkip.dyndns.org/,得到返回的文本後解析出本機在外網的IP地址
 * @author Administrator
 *
 */
public class ExternalIpAddressFetcher {
    // 外網IP提供者的網址
    private String externalIpProviderUrl;

    // 本機外網IP地址
    private String myExternalIpAddress;

    public ExternalIpAddressFetcher(String externalIpProviderUrl) {
        this.externalIpProviderUrl = externalIpProviderUrl;

        String returnedhtml = fetchExternalIpProviderHTML(externalIpProviderUrl);
        
        parse(returnedhtml);
    }

    /**
     * 從外網提供者處獲得包含本機外網地址的字符串
     * 從https://checkip.dyndns.org返回的字符串如下
     * <html><head><title>Current IP Check</title></head><body>Current IP Address: 123.147.226.222</body></html>
     * @param externalIpProviderUrl
     * @return
     */
    private String fetchExternalIpProviderHTML(String externalIpProviderUrl) {
        // 輸入流
        InputStream in = null;
        
        // 到外網提供者的Http連接
        HttpURLConnection httpConn = null;

        try {
            // 打開連接
            URL url = new URL(externalIpProviderUrl);
            httpConn = (HttpURLConnection) url.openConnection();
                        
            // 連接設置
            HttpURLConnection.setFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.setRequestProperty("User-Agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");

            // 獲取連接的輸入流
            in = httpConn.getInputStream();
            byte[] bytes=new byte[1024];// 此大小可根據實際情況調整
            
            // 讀取到數組中
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length
                   && (numRead=in.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            
            // 將字節轉化為為UTF-8的字符串        
            String receivedString=new String(bytes,"UTF-8");
            
            // 返回
            return receivedString;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                httpConn.disconnect();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        // 出現異常則返回空
        return null;
    }
    
    /**
     * 使用正則表達式解析返回的HTML文本,得到本機外網地址
     * @param html
     */
    private void parse(String html){
        Pattern pattern=Pattern.compile("(\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})", Pattern.CASE_INSENSITIVE);    
        Matcher matcher=pattern.matcher(html);        
        while(matcher.find()){
            myExternalIpAddress=matcher.group(0);
        }    
    }    

    /**
     * 得到本機外網地址,得不到則為空
     * @return
     */
    public String getMyExternalIpAddress() {
        return myExternalIpAddress;
    }
    
    public static void main(String[] args){
        ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher("https://checkip.dyndns.org/");
        
        System.out.println(fetcher.getMyExternalIpAddress());
    }
}


最後更新:2017-04-02 18:30:39

  上一篇:go 斐波那契數列(Fabonacci)兔子練習題
  下一篇:go super.getClass()方法調用