android網絡交互之DNS優化知識整理
之前的工作中,經常會遇到DNS解析出問題導致網絡交互的操作無法正常進行。
UnknownHostException
在很多的移動開發過程中,與服務端的交互的url通常是包含域名的。而在實際的網絡交互的過程中,第一步就需要對域名進行dns解析。
復雜的網絡環境里面,dns解析會耗費很長的時間、甚至是解析失敗。這是經常會發生的。
所以這一步的優化是非常至關重要的。
有那么一種方案叫:IP直連
就是在網絡交互的過程中,跳過域名的DNS解析,直接用IP進行網絡交互。可以避免這一大麻煩。
針對這一方案,衍生出了httpdns,目前有下面幾家出名的的:
- DNSPod D+ 移動解析服務D+ 免費
- 阿里
- 新浪
它們的基本的實現方法是:
- 將域名發送給httpdns服務器,得到該域名的IP地址
- 將該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(); } }
更多的內容和介紹,可以參考下面的文章:
- http://blog.csdn.net/a345017062/article/details/38047595
- 【鵝廠網事】全局精確流量調度新思路-HttpDNS服務詳解
- https://github.com/CNSRE/HTTPDNSLib