【问题标题】:Android: Using resolved IP Address instead of hostnameAndroid:使用解析的 IP 地址而不是主机名
【发布时间】:2011-06-17 07:37:53
【问题描述】:

我想使用解析的 IP 地址而不是主机名连接到服务器。这是我的代码 sn-ps:

     // 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 ADDRESS。现在我尝试如下替换我的网址:

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 将与您尝试手动执行的操作完全相同。
  • 用例是:负载均衡器后面配置了很多服务器。我尝试连接多次。我想对我出于某些分析目的首先连接的同一台服务器执行此操作。我不确定这是否可能,但从逻辑上讲它必须是可能的。我可以吗?
  • 嗯,这真的取决于负载均衡器的工作方式。除非您确定它正在执行基于 DNS 的负载平衡,否则这种方法无法确保您每次都访问同一台服务器。
  • 是否有任何其他方法可以确保从客户端连接到同一台服务器?我刚刚阅读了关于 Sticky 位的内容,但它是负载平衡器处理的。
  • 您需要与运行/拥有负载均衡器的人交谈,以了解它是如何工作的,以及是否有任何方法可以确保您反复访问该服务器。

标签: java android http networking resolveurl


【解决方案1】:

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

对于负载平衡器来说,它平衡的每个“站点”都有一个 IP 是很常见的,但是仍然不能保证您会为两个连续的请求连接到同一个后端。但是,有一些 Web 负载平衡器可以将虚拟主机的使用一直扩展到负载平衡层。

我只是尝试通过基于主机名的 URL 进行下载。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2011-03-12
      • 2014-10-13
      • 2013-01-29
      • 2011-10-15
      • 2021-10-08
      • 1970-01-01
      • 2011-05-07
      • 2019-09-29
      相关资源
      最近更新 更多