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
