如何从Android模拟器连接到我的http://localhost Web服务器

605

我应该如何在Android模拟器上连接到我的本地Web服务器页面,网址为http://localhosthttp://127.0.0.1

我已经尝试过,但模拟器仍然像对待Google搜索"localhost"一样对待我的请求,甚至更糟,它说找不到页面,尽管我的Web服务器正常运行。


3
这个问题涉及到 Android 模拟器,解决方案仅适用于该情况。如果您在使用实体 Android 设备时遇到此问题,请参考https://dev59.com/3G445IYBdhLWcg3wmLde。 - Chris Stratton
19个回答

1019

本地主机(localhost)指的是代码运行的设备,即模拟器。

如果要引用运行 Android 模拟器的计算机,请使用 IP 地址10.0.2.2

输入图片说明

您可以从这里了解更多信息。


16
为什么要提到其他问题?只需添加链接Android模拟器网络即可。 - Marvin Emil Brach
1
@primpap:我可以使用机器名称代替IP地址吗? - KJEjava48
@primpap,这在移动调试中不起作用。还有其他方法吗?或者我是哪里出错了,因为10.0.2.2在模拟器上运行良好,但连接移动设备进行USB调试时无法正常工作。? - Jawad Zeb
13
这个解决方案仅在模拟器上有效,正如在此特定问题中所要求的。那些在实际的 Android 设备上进行调试的人将不得不使用服务器的实际 IP 地址或名称,而不能使用这个仅限于模拟器的别名。这个答案是好的,但读者需要注意他们的情况是否适用。 - Chris Stratton
1
@Marvin Emil Brach 这个链接已经失效了。目前的链接是:https://developer.android.com/studio/run/emulator-networking - The incredible Jan
显示剩余5条评论

175

使用10.0.2.2作为默认 AVD 地址,而在中则使用10.0.3.2


那我们只需要在我们的主机文件中添加 10.0.3.2 吗? - ayjay
如果您正在使用Nativescript,则需要额外的步骤:https://stackoverflow.com/questions/56815634/why-my-emulator-doesnt-work-with-nativescript - Seph Reed

34

我在家里的电脑上使用10.0.2.2非常成功,但是在工作中却无法使用。经过数小时的尝试后,我使用Android虚拟设备(AVD)管理器创建了一个新的模拟器实例,最终10.0.2.2得以正常工作。

我不知道另一个模拟器实例出了什么问题(平台相同),但如果你发现10.0.2.2无法正常工作,请尝试创建一个新的模拟器实例。


8
很遗憾,即使创建了新的AVD实例,它对我也没有用。你有什么建议?重新安装一切吗? - Vlado Pandžić

31

访问 http://10.0.2.2:8080/,其中8080是您的端口号。它完美地工作。如果您只尝试10.0.2.2,它将无法正常工作。您需要添加端口号。此外,如果安装了Microsoft IIS,请尝试从控制面板关闭该功能(如果使用任何Windows操作系统),然后按照上述方法尝试。


3
如果页面托管在IIS上怎么办? - maracuja-juice
@Marimba 只需找出您的 IIS 服务器所使用的端口,然后访问 http://10.0.2.2:your_iis_port。 - StoneLam
这是一个已完成的字符串,只在我的Android 8.1模拟器上工作。 - CodeToLife
如果没有指定端口,那么它通常意味着80。如果您的服务器在另一个端口上监听,则必须明确指定该端口。 - The incredible Jan

28

每次运行模拟器时,您可以使用localhost:8000来连接到您机器的本地主机,只需运行以下命令即可(仅在Mac上测试通过):

adb reverse tcp:8000 tcp:8000

只需将其放入Android Studio终端中即可。

它基本上设置了一个反向代理,其中在您的手机上运行的http服务器接受端口上的连接并将它们连接到计算机或反之亦然。


1
如果您使用ssl和openAuth,这是最佳选项。 - DirectionUnkown
如果您遇到CORS问题,以下是最佳解决方案,非常感谢! - Symyon
对于像我这样使用Android Studio但无法调用adb的人来说,它确实已经被Android Studio安装了,但是由于某些原因,Android Studio没有自动将其添加到您的PATH中,您需要手动添加。请参阅以下内容以获取Windows、Linux和MacOS上的路径:https://medium.com/androiddevelopers/help-adb-is-not-found-93e9ed8a67ee - gaborous
我尝试了其他所有选项,但只有这个有效。 - Anudeep
所有这一切有什么意义? - The incredible Jan

10

根据文档:

10.0.2.2 - 特殊别名为主机环回接口(即,在开发机上是127.0.0.1)

查看模拟器网络以获取更多有关模拟器网络的技巧。


7

端口不重要,只有在有东西监听时它才“工作”。这个问题是关于 http://127.0.0.1,这意味着端口80。 - The incredible Jan

5

如果您正在使用Android模拟器:

您可以通过以下IP地址连接到计算机的localhost: 10.0.2.2:{您的localhost端口号} =>如果您在XAMPP中设置了端口号, 您必须使用该端口号。 在我的情况下是 10.0.2.2:2080

输入图像描述

输入图像描述

此外,您还可以使用网络适配器IP。在CMD中编写ipconfig并查找您的适配器IP地址:

输入图像描述

输入图像描述

如果模拟器无法连接到这些IP地址,请关闭模拟器并从AVD管理器中使用冷启动打开它:

输入图像描述

如果您正在使用Genymotion:

您可以通过以下IP地址连接到计算机的localhost: 10.0.3.2:{端口号} 或按上述所述使用您的适配器IP地址。在我的情况下是:192.168.1.3:2080


4

尽管我已经阅读了这里和其他地方的所有答案,但我仍然花费了数小时来调试此问题,因为地址10.0.2.2在Chrome浏览器中甚至无法工作。如果您遇到同样的问题,这里是一份逐步指南,以尝试调试并希望解决您的问题。

检查模拟器网关是否为10.0.2.2

在模拟的Android中,转到“设置”>“WiFi”,检查是否连接到AndroidWiFi热点(代表您的主机计算机),然后单击底部的“高级”,然后检查网关地址:它应该指向10.0.2.2。如果不是,则可能有其他问题,也许更改代理设置可以解决您的问题,请参见此处如何使用Android Studio自2022年以来进行操作,因为代理设置现在被隐藏起来了:如何在新版本的Android Studio中配置模拟器代理?

检查您的服务器是否可以从主机计算机访问

只需打开一个网页浏览器,输入http://localhost:<port>,以查看您的本地 Web 应用程序是否可访问。如果不能访问,则可能存在本地服务器参数问题。

检查模拟器是否可以访问您的服务器

打开 Chrome 浏览器,并将其指向 http://10.0.2.2:<port>(对于 Genymotion,请替换为 http://10.0.3.2:<port>)。如果您的 Web 应用程序显示出来,那么很好,您已经完成了。如果没有,则请测试下面的其他步骤以确定根本原因。

使用另一个服务器进行测试

如果您的 Web 应用程序可以从主机计算机访问,但无法在模拟器内部访问,则根本原因可能是您的本地服务器由于某种原因限制了对某些接口的访问,很可能是出于安全原因。

为了检查这一点,请尝试使用另一个服务器,只需使用简单的 HTTP 服务器即可,例如带有 nodejs 的 http-server,或者使用 Python 3 的 python -m http.server 8000

接下来,尝试从您的模拟器的 Chrome 浏览器访问这个简单的服务器,例如:http://10.0.2.2:8000。如果可以正常工作,则确认您的本地服务器正在限制对某些接口的访问。您需要阅读本地服务器的文档以扩大权限。

例如,在我的情况下,我的服务器是 angular-cli(AngularJS),默认情况下仅限于本地主机提供服务。为了使其工作,我不得不使用 ng serve --disable-host-check --host 0.0.0.0 而不是只使用 ng serve,如 this other question 中所建议的那样。--host 0.0.0.0 指示 Web 服务器提供所有接口。类似的参数也可以提供给大多数 Web 服务器。

另一种选择可能是禁用一些未使用的适配器,特别是虚拟适配器,如 VPN。

您的 Android 应用程序权限清晰文本

现在,你的 Web 应用程序应该可以通过模拟器内置的 Chrome 应用程序访问,使用 URL http://10.0.2.2:<port>。最后一个问题是,在你的 Android 应用程序中添加权限以访问 10.0.2.2,并且特别是对于没有安装 SSL 证书的本地 web 服务器(本地开发 web 服务器最可能的情况 - 只需检查 https://localhost:<port> 是否可用或者仅从主机计算机上访问http://localhost:<port>)。这将使你的 Android 应用程序能够像 Chrome 一样访问你的本地 web 服务器。
自 Android 9 (API 28) 以来,为了访问清晰文本 (即 http://),向你的 Android 应用程序添加特定权限是必要的。有几种方法可以配置你的 Android 应用程序以添加此权限,请参见:https://dev59.com/w1cO5IYBdhLWcg3wWgU0#50834600 结论
从 Android 模拟器访问宿主机可能有些棘手,但通过仔细的逐步调试,大多数情况下都可以解决问题。

本教程仅涵盖从Android模拟器内部访问/连接主机计算机上的本地Web服务器的问题,但一旦解决了这个问题,即使可达,Web应用程序可能仍然无法正常工作。一个例子是经历无限加载循环。要在解决可达性后进一步调试问题,您可以在Chrome浏览器中使用chrome://inspect附加到Android模拟器内部的Android WebView,并像在计算机上呈现一样进行实时调试。

最后一个选择,可能更快的方法是订阅付费服务,例如ngrok,但免费版本是无用的,因为它们必须在Android应用程序的Webview之外的Web浏览器中打开Web应用程序。


3

我需要找到模拟器"Nox App Player"的系统主机IP地址。以下是我如何找出它的方法:172.17.100.2.

  1. 从应用商店安装Android Terminal Emulator。
  2. 发出ip link show命令以显示所有网络接口。特别感兴趣的是eth1接口。
  3. 发出ifconfig eth1命令,显示网络为172.17.100.15/255.255.255.0
  4. 开始ping从172.17.100.1开始的地址,在"172.17.100.2"上找到了一个匹配项。不确定防火墙是否会干扰,但在我的情况下没有。

也许这可以帮助其他人为其他模拟器解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接