在android应用程序中连接到主机名而不是IP地址

Posted

技术标签:

【中文标题】在android应用程序中连接到主机名而不是IP地址【英文标题】:Connect to host name instead of IP address in android app 【发布时间】:2015-01-22 01:05:13 【问题描述】:

我正在构建一个连接到我笔记本电脑上的后端服务的 android 应用程序。它连接到从 JSON 获取数据的本地主机地址。

当我在代码中写入笔记本电脑的 IP 地址时,它可以正常工作。 此 IP 地址可以更改,因此我想使用似乎不起作用的主机名。

私有静态最终字符串 URLLocalhost = "http://localhost:8081/"; // 不起作用 private static final String URLPCName = "http://PCNAME:8081/"; // 不起作用 private static final 字符串 URLIPAddress = "http://192.168.x.y:8081/"; // 工作,但 IP 需要修改

@Override
public List<Spike> getSpikes() 
    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(URLPCName).build();

当它不起作用时,我收到多个 ECONNREFUSED 错误。 它不会很快公开,所以我没有那个网址。

我为此找到了some solutions,但他们需要对我的设备进行更改。 (没试过)

更改 DNS 设置 编辑主机文件

我希望任何设备(可能仅限于本地 wifi)访问此服务,而无需更改设备中的设置。

如何使用代码中的主机名进行连接?


相关问题,没有解决我的问题:How to connect my android app to the remote web server

【问题讨论】:

您的 PCNAME 在您连接的网络中是否可以访问? 是的,我可以从同一网络上的其他笔记本电脑访问它。 和设备连接到同一个网络 是的,确实如此。 (如果不是,IP 地址会起作用吗?) 【参考方案1】:

是的,AIUI,这正如预期的那样。 localhost 指的是 Android 设备正在使用的适配器,因此会将请求路由到手机本身(因此会失败)。

原始 IP 可以正常工作,因为它在所有设备中都是明确的。

http://PCNAME:8081/ 有点取决于PCNAME 的名称,以及您的笔记本电脑正在运行什么。如果那是 Windows 机器名称(使用 WINS),那么默认情况下它在 Android / Linux 上不起作用。切换到 FQDN,例如PCNAME.subdomain.mydomain.org 应该可以工作,但这依赖于您的 DHCP 路由器(或您想要避免的 Android 中的手动网络设置)在未指定时搜索该域,并且 Android 尊重无线路由,我发现它没有't(可能是this Android bug)。

可能更容易将它传递给构建参数,或者在构建中包含用于调试和生产设置的配置文件。另一个简单的解决方法是使用 DHCP 保留为您的笔记本电脑保留一个静态 IP,或者手动指定一个 IP。

【讨论】:

我的笔记本确实是一台windows机器。 好的,那么如上所述,您需要在 Windows / 本地网络设置中整理您的 DNS。在您拥有set the DNS domain 之前,您的 Windows PCNAME 不是有效的 (DNS) 主机名。另一种选择是任意数量的服务发现协议,以动态找出您的服务器端点在哪里(例如 UPnP 的 SSDP、Eureka 等各种东西),但在这里可能有点矫枉过正......

以上是关于在android应用程序中连接到主机名而不是IP地址的主要内容,如果未能解决你的问题,请参考以下文章

实用程序 iptables 列出主机名而不是 IP 地址

设备在Android中连接到WiFi时如何获取蜂窝网络的IP地址

通过主机名连接到 Java 套接字

CryptoLicensing - 使用主机名连接到服务

Android:使用 ***Service API 在 Android 4.0 中连接到 *** 的示例代码 [关闭]

在雅虎虚拟主机中连接到我的数据库的代码