从Android模拟器访问本地主机:端口

327

我在本地机器上运行一个Web服务,它在localhost:54722运行。

我想从Android模拟器中运行的应用程序调用该服务。

我读到在应用程序中使用10.0.2.2访问本地主机,但是这似乎无法与端口号一起使用。它显示HttpResponseException:Bad Request


1
我预期了这种情况,即并非所有端口都被转发...5555 端口未被转发,但 8080 和 8081 端口正常工作... - Florian Loch
你需要编辑你的vs-iis配置文件:https://dev59.com/LFUM5IYBdhLWcg3wIdhd#50991257 - Nick Kovalsky
26个回答

539

您可以使用IP地址“10.0.2.2”访问您的主机。

这是由Android团队设计的。因此,您的Web服务器可以完美地在本地主机上运行,并且从Android应用程序中,您可以通过“http://10.0.2.2:<hostport>”访问它。

如果您的模拟器必须通过代理服务器访问互联网,则可以从模拟器的“扩展控件”屏幕配置自定义HTTP代理。打开模拟器后,点击更多dots,然后单击设置代理。从这里,您可以定义自己的HTTP代理设置。 “HTTP配置的截图“


11
为什么会这样呢?错误的请求意味着本地主机服务器可以访问,但请求不太正确。 - Dediqated
34
显然,这并没有澄清任何问题,Robin 在问题中已经使用了 10.0.2.2 IP 地址,但它并没有起作用。尽管你的答案是正确的,但它并没有提供解决方案。 - iversoncru
1
我也用同样的解决方案遇到了400:错误请求错误。 - Keval Patel
这个可以用来路由请求,但对于多租户(通配符子域)依赖应用程序,在登录后就无法工作。 - Archonic
2
这个答案为我提供了完整的解决方案,让我成功地运行起来了:https://dev59.com/pW035IYBdhLWcg3wQtog#55606008 - Craig Labenz
显示剩余9条评论

84

使用 10.0.2.2 作为默认 AVD 地址,10.0.3.2 作为 Genymotion 地址。


6
为什么在Genymotion中使用10.0.3.2? - Jacob
2
@Jacob 因为Genymotion是一个不同的模拟器,他们选择使用了一个不同于谷歌模拟器的IP地址(这几乎没有用。说真的,他们什么时候才会对他们糟糕的默认模拟器采取行动呢?) - computrius
在API 28+中,您还应明确允许网络配置中的非HTTPS(明文)流量。请参见我的下面的答案 https://dev59.com/g2w15IYBdhLWcg3wMpAY#56769746 - Ismail Yavuz
有些模拟器在AVD上无法工作,我不得不删除并重新安装另一个模拟器才能让10.0.2.2正常工作。 - Gabriel Rogath

43

由于10.0.2.2不是Android上的安全域名,因此您需要在API 28+的网络配置中允许非安全域名,这些域名默认情况下会被阻止非TLS连接。

您可以使用以下配置:

在main/res/xml/目录下创建一个名为network_security_config.xml的新文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

并在 AndroidManifest.xml 中指向它。

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">

我认为这是正确的答案,虽然它很容易实现,只需将以下内容添加到您的清单中(如此处所提出:https://dev59.com/2lQK5IYBdhLWcg3wbPL7):<application android:usesCleartextTraffic="true"> </application> - jpm
如果您正在使用API > 28,请查看此答案,这应该可以解决您的问题。 - Thanh Nguyen
我不知道IP和端口号。 我的本地服务器在m.local.sese.com上运行。我如何在模拟器中访问它? - Rohit Singh

37

我不确定这个解决方案是否适用于所有的Android模拟器和每一个Android SDK版本,但是对我来说运行以下命令起到了作用。

adb reverse tcp:54722 tcp:54722
您需要启动模拟器,然后才能成功在运行的模拟器设备内访问localhost:54722

对我来说最简单的方法。将其保存到npm脚本中 "android-map-localhost": "adb reverse tcp:54722 tcp:54722" - fullStackChris

31

1
这个与10.0.0.2网址结合使用解决了我的问题。这个设置似乎覆盖了其他地方解释的hosting.json方法。 - user761574
1
我在macOS本地运行django服务器,通常我通过Postman和iOS模拟器访问它,网址为http://localhost:5000/。这个解决方案适用于Android模拟器,无需修改我的服务器或模拟器的任何设置。快速、简便且可移植到其他计算机,不需要额外的工作。 - John Pang
使用VS开发的Xamarin和ASP.NET Web API的Android应用程序。成功了!谢谢!! - sohaib javed
这是最简单的方法...当我尝试从我的模拟器连接到使用 .net core 3.1 在 VS 2019 上开发的 API REST 时,它对我很有效...谢谢! - Ramiro G.M.
这对我也起作用了。我最初忽略的一件事是,.NET Core将applicationURL设置为https,而此解决方案使用http,在更改为这样后就可以工作了。 - Rizwan Mohammed

19

如果您正在使用IIS Express,则可能需要绑定到所有主机名而不仅仅是“localhost”。请查看此详细答案:

https://dev59.com/anA75IYBdhLWcg3waIMJ#15809698

告诉IIS Express本身绑定到所有IP地址和主机名。在您的.config文件中(通常为%userprofile%\ My Documents \ IISExpress \ config \ applicationhost.config,或 $(solutionDir).vs\config\applicationhost.config用于Visual Studio 2015),找到您网站的绑定元素,然后添加以下内容:

<binding protocol="http" bindingInformation="*:8080:*" />
确保将它添加为第二个绑定项,而不是修改现有的绑定项,否则 VS 将只会重新添加一个新站点,附加了一个 (1)。此外,您可能需要以管理员身份运行 VS。

不,你并不总是需要使用空白主机名。https://blog.lextudio.com/how-to-let-android-emulator-access-iis-express-f6530a02b1d3 - Lex Li
<binding protocol="http" bindingInformation="*:15000:127.0.0.1" /> 这是 IIS Express 喜欢的方式,其中 15000 是我的端口,然后在 Android 模拟器上指向 10.0.2.2:15000。 - dpineda
经过尝试不同的选项,这个解决方案是唯一一个起作用的!非常感谢。 - user2310909
不行!如果我修改文件的端口,那么Web服务器就无法运行。 - Akira Chen

16

我在Visual Studio Professional 2015中安装了"Conveyor by Keyoti"来解决这个问题。 Conveyor生成一个带有端口(45455)的远程地址(你的IP),使外部请求得以实现。 例如:

输入图像描述

Conveyor允许您在网络上从外部平板电脑和手机或Android模拟器(无需http://10.0.2.2:<hostport>)测试Web应用程序。

步骤请参考以下链接:

https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti


如果您不在Visual Studio中运行Web服务器怎么办?在我看来,这并不是问题的答案。 - jAC
我尝试了一下,但几天后给定的URL不起作用,也找不到任何解决方案。 - Md Imran Choudhury
经过长时间的努力,唯一有效的方法是安装这个扩展并启用远程URL功能。虽然请求需要更长的时间才能到达API,但它确实起作用。 - fabian278

14
在运行本地主机后,你会得到http://localhost:[端口号]/,在这里找到你的端口号。
然后从控制台获取你的IP地址,在Windows命令提示符中输入ipconfig enter image description here 在我的情况下,IP是192.168.10.33,因此我的URL将是http://192.168.10.33:[端口号]。在Android Studio中,该URL用作您的URL。之后,在模拟器的手动代理中设置您的URL和端口号。 enter image description here

1
我的Android Studio版本是Chipmunk| 2021.2.1 Patch1。而我的模拟器设置中没有代理选项卡。你能告诉我你的Android Studio版本吗?或者有没有解决这个问题的方法? - Akira Chen

13

问题在于Android模拟器将10.0.2.2映射到127.0.0.1,而不是localhost。因此,请将您的Web服务器配置为在127.0.0.1:54722上提供服务,而不是localhost:54722。这样应该就可以了。


11

我在本地主机上运行了一个网络服务器。

如果我打开模拟器并想连接到我的本地主机,则使用 192.168.x.x。这意味着您应该使用本地局域网IP地址。顺便说一句,您的HttpResponseException (Bad Request)并不意味着主机不可达。

一些其他错误会导致此异常。


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