从Android模拟器访问localhost:port


224

我在运行的本地计算机上运行Web服务localhost:54722

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

我读到,10.0.2.2在应用程序中使用可以访问localhost,但它似乎也不适用于端口号。它说HttpResponseException: Bad Request



1
我期望这种行为,不是所有端口都被转发了……5555没有转发,但是8080和8081工作得很好……
Florian Loch

您需要编辑vs-iis配置文件:stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Answers:


408

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

这是由Android团队以这种方式设计的。因此,您的网络服务器可以完美地在localhost上运行,您可以通过Android应用程序通过“ http://10.0.2.2:<hostport>” 访问它。

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


9
为什么要这样 错误的错误请求表示该localhost服务器可访问,但该请求不是很正确
。–

我不确定,我一直遵循,您到底在说什么,与提供的解决方案有关吗?
阿希尔·Ja那

目前无法为我工作,但这是Android文档的链接,很明显,这就是应做的事情(10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows 2014年

23
显然,这并不能说明任何问题,Robin已经在问题中使用了10.0.2.2 ip,并且无法正常工作。尽管您的答案是正确的,但它没有提供解决方案。
iversoncru

我也得到400:使用相同解决方案的错误请求错误。
Keval Patel

55

对于默认的AVD使用10.0.2.2,对于Genymotion使用10.0.3.2


4
为什么要使用Genymotion 10.0.3.2?
雅各布

1
@Jacob因为Genymotion是一个不同的仿真器,他们选择使用与Google仿真器不同的ip(无用的边界。说真的,他们什么时候打算对其糟糕的默认仿真器做些什么?)
computrius

在API 28+中,您也应该在网络配置中明确允许非https(明文)流量。见我的回答如下stackoverflow.com/a/56769746/2290369
伊斯梅尔Yavuz的

19

在IIS Express上执行Web应用程序的Visual Studio上,我遇到了相同的问题。要修复它,您需要转到项目属性,然后单击“调试”选项卡,然后将http:// localhost:[您的端口]更改为http://127.0.0.1 :[您的端口] 并将android url设置为http:/ /10.0.2.2:[您的端口]。它为我工作。


1
结合10.0.0.2 url为我解决了它。此设置似乎将覆盖其他地方介绍的hosting.json方法。
user761574

1
我在macOS上本地运行django服务器,通常我可以通过http://localhost:5000/Postman和iOS模拟器来访问它。此解决方案适用于Android模拟器,无需修改服务器,也无需修改模拟器中的任何设置。快速,美观,可移植到其他计算机,无需额外工作。

带有xamarin和ASP.NET Web API的Android应用程序均使用VS。工作了!谢谢!!
sohaib

15

如果您使用的是IIS Express,则可能需要绑定到所有主机名,而不仅仅是“ localhost”。检查这个好的答案:

https://stackoverflow.com/a/15809698/383761

告诉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。


不,您不必总是使用空白的主机名,blog.lextudio.com /…
Lex Li

<binding protocol =“ http” bindingInformation =“ *:15000:127.0.0.1” />就是IIS Express喜欢的方式,其中15000是我的端口,然后在android仿真器上指向10.0.2.2:15000
dpineda

11

我通过在Visual Studio Professional 2015中安装“通过Keyoti传送器”解决了该问题。传送器通过启用外部请求的端口(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不起作用,也找不到任何解决方案。
伊德兰·乔杜里

经过长时间的努力,唯一成功的办法就是安装此扩展并启用远程URL功能。要求花费更长的时间才能访问API,但是它可以工作。
fabian278

9

我有一个在本地主机上运行的Web服务器。

如果我打开模拟器并想连接到我的本地主机,我正在使用192.168.x.x。这意味着您应该使用您的本地lan ip地址。顺便说一句,您HttpResponseException (Bad Request)并不意味着主机不可访问。

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


9

由于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">

8

问题是,Android模拟器映射10.0.2.2127.0.0.1不能localhost。因此,将您的Web服务器配置为serveron 127.0.0.1:54722而不是localhost:54722。那应该做。


7

运行本地主机后,您会到达http://localhost:[port number]/此处,找到了端口号。

然后从Command获取IP地址,打开Windows命令并输入 ipconfig 在此处输入图片说明

在我的情况下,使用IP,192.168.10.33因此我的URL将为http://192.168.10.33:[端口号] /。在Android中,工作室使用此URL作为您的URL。然后,在模拟器的手动代理中设置URL和端口号。

在此处输入图片说明


3

您需要将URL设置为 10.0.2.2:portNr

portNr = ASP.NET开发服务器给定的端口,我当前的服务运行在 localhost:3229/Service.svc

所以我的网址是 10.0.2.2:3229

我这样解决了我的问题

我希望它可以帮助...


3

“ BadRequest”是通常由服务器本身发送的错误,请参见rfc 2616

10.4.1 400错误的请求

由于语法格式错误,服务器无法理解该请求。客户不应在没有修改的情况下重复请求。

这样您就可以与服务器建立有效的连接,但是您的请求不适合expecet表单。我不知道如何创建连接,不包括哪些头(如果有的话)–但这就是您应检查的内容。

如果您需要更多帮助,请说明您的代码含义以及与服务器连接所使用的代码,因此,我们有一个全面的了解。

是一个与问题相同的问题–答案是未在标头中设置内容类型。


您的观点正确,但后来却走错了方向。下一步应该是分析服务器,以了解它关心的是哪种请求,以便了解为什么仿真器的请求会被回复400。有关IIS Express的案例研究,请参见blog.lextudio.com/…。
Lex Li

1

我想向您展示我从Android模拟器访问IISExpress Web API的方式。我使用的是Visual Studio2015。我从Android Studio调用Android模拟器。

我需要做的就是将以下行添加到applicationhost.config文件中的绑定配置中

<binding protocol="http" bindingInformation="*:<your-port>:" />

然后我检查并使用IP4地址从Android模拟器访问我的API

要求:您必须以管理员身份运行Visual Studio。这篇文章提供了一个完美的方法来做到这一点。

有关更多详细信息,请访问在github上的帖子

希望这可以帮助。


2
或从“扩展程序”窗口安装免费的VS扩展程序,称为“传送带”。这无需更改配置即可将IIS Express开放给外部请求。
Jim W说要恢复莫妮卡的时间

除了以管理员身份运行VS之外,您还有其他选择blog.lextudio.com/…。所以我不会认为这是必须的
Lex Li

1

对于Laravel Homestead用户:如果有人将Laravel与Homestead一起使用,则可以在模拟器中使用192.168.10.10访问应用程序后端

还是行不通?另一个好的解决方案是使用ngrok https://ngrok.com/


1

我正在使用Windows 10作为开发平台,无法在仿真器中访问10.0.2.2:port,并且此问题中的其他解决方案也无法达到预期的效果。

经过几个小时的挖掘,我发现如果在模拟器启动命令中添加-writable-system参数,则一切正常。

您必须通过如下所示的命令行启动仿真器:

 emulator.exe -avd <emulator_name> -writable-system

然后在模拟器中,您可以使用LAN IP地址和绑定端口访问在主机上运行的API服务:

http://192.168.1.2:<port>

希望这可以帮助你。

关于从命令行启动模拟器:https : //developer.android.com/studio/run/emulator-commandline


1

在Android Emulator上访问localhost

  • 从AndroidManifest.xml添加互联网权限
    <uses-permission android:name="android.permission.INTERNET" />

  • 在此处添加android:usesCleartextTraffic="true"更多详细信息:

  • 运行以下命令以找到您的系统IP地址:

ifconfig | grep "inet " | grep -v 127.0.0.1

复制从此步骤(A)获得的IP地址

  • 运行您的后端应用程序,您可以在系统中localhost127.0.0.1从系统中访问它。

  • 现在在android studio中,如果您在代码中使用,则可以替换URL,或者您可以使用从步骤(A)获得的IP地址,然后尝试在网络浏览器中打开,例如http://192.168.0.102:8080/

不要忘记在IP地址之后添加PORT,在我的情况下,应用程序在8080端口上运行,因此我添加了在(A)中使用8080端口获得的IP


0

本地主机似乎在启动时在我的模拟器中运行良好,然后我开始获得连接被拒绝的异常,我从模拟器浏览器中使用了127.0.2.2,当它在我的Android应用程序中在模拟器中使用时,它再次开始显示连接被拒绝的问题。

然后我做了ifconfig并且我使用了IP 192.168.2.2,它工作得很好


0

错误的请求通常表示您发送的数据格式不正确。数据映射可能不匹配。如果请求很糟糕,则意味着您可以连接到服务器,但是请求发送不正确。


0

如果仍然有人在寻找这个,这就是它为我工作的方式。

您需要找到您所连接设备/仿真器的机器IP。对于仿真器,请按照以下步骤操作;

  1. 转到“虚拟机虚拟”框->在列表中选择连接的设备。
  2. 选择设置->网络->查找设备连接到的网络。对我而言,它是“ VirtualBox仅主机以太网适配器#2”。
  3. 在virtualbox中,转到“文件”->“首选项”->“网络”->“仅主机网络”,然后找到在上一步中指定的网络的IPv4。(通过悬停您将获得信息)

提供此IP以从仿真器访问localhost。该端口与运行/发布服务时提供的端口相同。

注意#1:请确保已处理好防火墙和入站规则。

注意#2:重新启动计算机后,请检查此IP。由于某些原因,即使我提供了“使用以下IP”,“仅主机” IP也已更改。


0

当服务层使用Visual Studio IIS Express时,我解决了确切的问题。只需指向10.0.2.2:端口将无法工作。我没有像其他帖子所提到的那样乱搞IIS Express,而是在IIS Express前面放置了一个代理。例如,apache或nginx。nginx.conf看起来像

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

    location / {
        proxy_pass http://localhost:54722;
    }
  }

然后,Android需要指向我的IP地址为192.168.xx:8090


0

如果您正在使用诸如node express或angular-cli之类的第三方软件包,则需要找到计算机的IP,并将主机附加到服务器启动配置(而不是localhost)中的IP。然后使用IP从仿真器启动它。例如,我必须使用:ng serve -H 10.149.212.104以使用angular-cli。然后从模拟器中使用:http://10.149.212.104:4200


0

1)在cmd中运行ipconfig命令

2)你会得到这样的结果 在此处输入图片说明

3)然后使用VMWare网络适配器1的IPv4地址和端口号

在我的情况下为8080,因此不要使用localhost:8080

我正在使用192.168.56.1:8080

在此处输入图片说明

完成.....


0

localhost对于有基本访问问题的任何人,说明不能从模拟器获得为什么。对于复杂的案例,请阅读其他答案。

问题:仿真器拥有自己的局域网并将localhost其自身映射到仿真器,但不是您的主机!

解:

  1. 绑定服务器以0.0.0.0使其可用于仿真器的网络
  2. 获取笔记本电脑的外部IP地址:ifconfig适用于Mac的命令
  3. 在Android中(或扑动的应用程序)使用你喜欢的外部接口的IP地址:192.168.1.10代替localhost

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.