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