Java Android:使用解析的IP地址而不是主机名
我希望使用解析的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
// 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,但这是负载平衡器处理的事情。你需要与运行/拥有负载平衡器的人交谈,了解它的工作原理,以及是否有任何方法可以确保你重复访问该服务器。