为什么在 Android 客户端连接本地 Web 服务器时要使用 10.0.2.2 而不是计算机 IP 地址?

85
通常我们在URL中使用10.0.2.2:(端口号)来连接本地Web服务器,但是我们应该使用计算机的IP地址而不是10.0.2.2。那么为什么我们会使用10.0.2.2呢?

也许10.0.0.2是计算机的IP地址? - miniBill
@Blackbelt,链接已经失效,请更新。 - Nike15
@minBill 10.0.0.2 不是计算机的 IP 地址,它是您主机环回接口的特殊别名(即在开发机器上的 127.0.0.1)。 - Saharsh
4个回答

98

网络地址空间

模拟器的每个实例都在虚拟路由器/防火墙服务后面运行,使其与开发机的网络接口和设置以及互联网隔离。模拟设备看不到您的开发机或网络上其他模拟器实例,只能看到通过Ethernet连接到路由器/防火墙。

每个实例的虚拟路由器管理10.0.2/24网络地址空间-路由器管理的所有地址都采用 10.0.2.<xx>这种形式,其中<xx>是一个数字。该空间内的地址由模拟器 /路由器预分配如下:

网络地址描述

10.0.2.1    Router/gateway address
10.0.2.2    Special alias to your host loopback interface (i.e., 127.0.0.1 on your development machine)
10.0.2.3    First DNS server
10.0.2.4 / 10.0.2.5 / 10.0.2.6  Optional second, third and fourth DNS server (if any)
10.0.2.15   The emulated device's own network/ethernet interface
127.0.0.1   The emulated device's own loopback interface

6
@robert,答案来自https://developer.android.com/studio/run/emulator-networking.html。 - Zephyr
虚拟网关的IP地址(10.0.2.1)对于模拟设备来说是不可见的吗?我尝试了“adb shell ping 10.0.2.1”,但无法到达它。 - stdout

36
如果您在计算机上同时运行服务器和模拟器,127.0.0.1:(端口号)将指代模拟器本身而不是服务器。10.0.2.2是解决该问题的方法 :) 希望这有所帮助。

25

使用10.0.2.2的原因是因为它是您主机的回环接口(即127.0.0.1)的特殊别名。这就是为什么它能够正常工作的原因,是不是很酷呢?


14
如果您使用10.0.2.2进行连接,它将始终指向本地主机。 在阅读此信息之前,我曾经使用我的机器的真实IP,并且以两种方式都可以工作。
使用10.0.2.2的优点是您不需要关心真正的IP是什么,因此您可以更轻松地将项目移动到另一台计算机上。

使用10.0.2.2的另一个优点是,即使您的计算机未连接到互联网,它也可以正常工作。 - Bruno Haible
2
嗨,感谢您的回答,但我正在尝试使用通过USB连接的物理设备进行相同的操作,但是使用10.0.2.2无法正常工作。您知道如何使用物理设备执行相同的操作吗? - Richlewis
嗨,我不认为会有这种情况。模拟器运行在您的计算机上,而物理设备完全独立(不同的主机)。我不知道是否有解决方案不涉及直接连接到您计算机的 IP 地址。 - azertiti

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