Java Android:使用解析的IP地址而不是主机名

Java Android:使用解析的IP地址而不是主机名,java,android,http,networking,resolveurl,Java,Android,Http,Networking,Resolveurl,我希望使用解析的IP地址连接到服务器,而不是主机名。以下是我的代码片段: // Get domain name from URL String domainName = url.substring("http://".length(), url.indexOf("/", 8)); // Get IP address as string InetAddress inet = null; try { inet = In

我希望使用解析的IP地址连接到服务器,而不是主机名。以下是我的代码片段:

     // Get domain name from URL
    String domainName = url.substring("http://".length(),
            url.indexOf("/", 8));
    // Get IP address as string
    InetAddress inet = null;
    try {
        inet = InetAddress.getByName(domainName);
    } catch (UnknownHostException e) {
        Log.i(TAG, "The IP address cannot be resolved for " + domainName);
    }
        resolvedIP = inet.getHostAddress(); 
在这里,我能够成功地获得IP地址。现在我尝试替换我的url,如下所示:

url = url.replace(domainName, resolvedIP);

Now I connect to server:
URL download = new URL(url);


conn = (HttpURLConnection) url.openConnection();

conn.getInputStream(); //Throws IO Exception
如果我按原样使用URL,我就能成功连接(无需将域名替换为IP地址)


请让我知道我的操作是否正确。

作为一般规则,请尝试使用基于主机名的URL。在同一IP上有多个web站点并不少见,它们仅通过站点名称(所谓的虚拟主机)进行区分。您所做的仅适用于给定IP上有一个站点的情况

负载平衡器为其平衡的每个“站点”都有一个IP是很常见的,但是仍然不能保证您将连接到同一个后端进行两个连续的请求。然而,有一些web负载均衡器将虚拟主机的使用一直扩展到负载平衡层


我会尽量坚持使用基于主机名的URL进行下载。

解决VHost问题的一个解决方案是使用您自己的DNS服务器,并始终为您连接的主机返回相同的ip地址


这不需要更改您的应用程序。

如果这是一个愚蠢的问题,很抱歉,但您为什么需要这样做?使用带有主机名的URL将与您尝试手动执行的操作完全相同。用例是:在负载平衡器后面配置了许多服务器。我尝试了多次连接。我想对第一次连接用于分析目的的同一台服务器执行此操作。我不确定这是否可能,但从逻辑上讲,这必须是可能的。我可以吗?这取决于负载平衡器的工作方式。除非您确定它正在进行基于DNS的负载平衡,否则此方法将无法确保您每次都访问同一台服务器。是否有其他方法确保从客户端连接到同一台服务器?我刚读到Sticky bit,但这是负载平衡器处理的事情。你需要与运行/拥有负载平衡器的人交谈,了解它的工作原理,以及是否有任何方法可以确保你重复访问该服务器。