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();
        }
    }

  

更多的内容和介绍,可以参考下面的文章:

原文地址:https://www.cnblogs.com/zhou-guobao/p/5401124.html