android網絡交互之DNS優化知識整理


android網絡交互之DNS優化知識整理

之前的工作中,經常會遇到DNS解析出問題導致網絡交互的操作無法正常進行。

UnknownHostException

在很多的移動開發過程中,與服務端的交互的url通常是包含域名的。而在實際的網絡交互的過程中,第一步就需要對域名進行dns解析。

復雜的網絡環境里面,dns解析會耗費很長的時間、甚至是解析失敗。這是經常會發生的。

所以這一步的優化是非常至關重要的。

有那么一種方案叫:IP直連

就是在網絡交互的過程中,跳過域名的DNS解析,直接用IP進行網絡交互。可以避免這一大麻煩。

針對這一方案,衍生出了httpdns,目前有下面幾家出名的的:

  • DNSPod D+ 移動解析服務D+  免費
  • 阿里
  • 新浪

它們的基本的實現方法是:

  1. 將域名發送給httpdns服務器,得到該域名的IP地址
  2. 將該IP地址替換掉域名,進行網絡訪問

當然,這里面每一步都有很多的細節。

其中需要重要的一點是:對於一個IP主機掛載多個Server的情況,在使用IP直連時,Host頭需要設置域名

代碼如下:

    public static HttpURLConnection getHttpURLConnection(String urlString)
            throws IOException {
        URL url = new URL(urlString);
        String originHost = url.getHost();
        HttpURLConnection conn;

        String dstIp = httpdnsService.getIpByHost(url.getHost()); //這里得到了IP地址
        if (dstIp != null) {
            Log.d("HttpDNS Demo", "Get IP from HttpDNS, " + url.getHost() + ": " + dstIp);
            urlString = urlString.replaceFirst(url.getHost(), dstIp);
            url = new URL(urlString);
            conn = (HttpURLConnection) url.openConnection();
            // 設置HTTP請求頭Host域
            conn.setRequestProperty("Host", originHost); // 這里是設置head中的host
            return conn;
        } else {
            Log.d("HttpDNS Demo", "Degrade to local DNS.");
            return (HttpURLConnection) url.openConnection();
        }
    }

  

更多的內容和介紹,可以參考下面的文章:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM