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

      

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

  • 相关阅读:
    dubbo注册zookeeper保错原因
    Django 终端打印SQL语句
    Django 的orm模型
    Django 的路由系统
    Django 开端
    前端 jq的ajax请求
    前端 后台
    前端 JQ操作
    前端 链式操作
    前端 JQ事件操作
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/5401124.html
走看看 - 开发者的网上家园