从Android模拟器访问localhost:端口

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

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

我读到在应用程序中使用10.0.2.2将访问localhost,但它似乎不能与端口号一起工作。它说HttpResponseException: Bad Request

280879 次浏览

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

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

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

你可以通过IP地址“10.0.2.2”访问你的主机。

Android团队就是这样设计的。所以你的web服务器可以完美地运行在本地主机和从你的Android应用程序,你可以通过“http://10.0.2.2:<hostport>”访问它。

如果您的模拟器必须通过代理服务器访问internet,您可以从模拟器的扩展控件屏幕配置自定义HTTP代理。打开模拟器后,单击更多的 dots,然后单击设置代理。从这里,您可以定义自己的HTTP代理设置。 screen-shot for HTTP config < / p >

"BadRequest"是一个通常由服务器本身发送的错误,参见rfc 2616

10.4.1 400个错误请求

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

因此,您获得了到服务器的工作连接,但是您的请求不符合预期的形式。我不知道你如何创建连接,包括什么头(如果有的话)-但这是你应该检查。

如果您需要更多的帮助,请解释一下您的代码是关于什么的,以及它用来连接到服务器的是什么,这样我们就有了总体的了解。

在这里是一个具有相同问题的问题-答案是在头文件中没有设置内容类型。

你需要将URL设置为10.0.2.2:portNr

portNr =指定端口的ASP。我当前的服务运行在localhost:3229/Service.svc

所以我的url是10.0.2.2:3229

我用这种方法解决了我的问题

我希望它能有所帮助……

localhost在启动时似乎在我的模拟器中工作正常,然后我开始得到连接拒绝异常 我使用了模拟器浏览器中的127.0.2.2,它可以工作,当我在模拟器中使用我的android应用程序时,它再次开始显示连接拒绝问题

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

默认AVD使用10.0.2.2, Genymotion使用10.0.3.2

如果您正在使用IIS Express,您可能需要绑定到所有主机名,而不仅仅是“localhost”。看看这个精彩的答案:

https://stackoverflow.com/a/15809698/383761 < a href = " https://stackoverflow.com/a/15809698/383761 " > < / >

告诉IIS Express本身绑定到所有ip地址和主机名。在你的.config文件中(通常是%userprofile%\My 文档\ IISExpress \ config \ applicationhost。配置,或者 $ (solutionDir) .vs \ config \ applicationhost。Visual Studio配置 2015),找到你的网站的绑定元素,并添加

<binding protocol="http" bindingInformation="*:8080:*" />

确保将它作为第二个绑定添加,而不是修改现有的绑定,否则VS将重新添加一个附加了(1)的新站点。此外,你可能需要以管理员身份运行VS。

坏请求通常意味着您发送的数据格式不正确。可能是数据映射不匹配。如果您正在收到坏请求,则意味着您能够连接到服务器,但请求没有正确发送。

如果有人还在寻找这个,这就是我的工作方式。

您需要找到您的机器相对于您所连接的设备/模拟器的IP。对于模拟器的方法是按照以下步骤;

  1. 进入虚拟机虚拟框->在列表中选择连接的设备。
  2. 选择“设置”->网络->确认设备连接到哪个网络。对我来说,它是“VirtualBox主机专用以太网适配器#2”。
  3. 在virtualbox中进入“文件->首选项->网络->主机专用网络”,找到上面步骤中指定的网络的IPv4。(通过悬停你会得到信息)

提供这个IP以从模拟器访问本地主机。端口与您在运行/发布服务时提供的端口相同。

注1:确保你已经照顾防火墙和入站规则。

注2:请重新启动计算机后检查此IP。由于某种原因,即使我提供了“使用以下IP”,主机IP也发生了变化。

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

我所需要做的就是在我的< em > applicationhost.config < / em >文件中添加下面这行绑定配置

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

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

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

更多详细信息,请访问github上的我的帖子

希望这能有所帮助。

我解决了服务层使用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.x.x:8090

我在Visual Studio Professional 2015中安装了“输送机by Keyoti”来解决这个问题。 输送机生成一个远程地址(您的IP),端口(45455)支持外部请求。 例子:< / p >

enter image description here

输送机允许您从外部平板电脑和手机在您的网络或从Android模拟器测试web应用程序(没有http://10.0.2.2:<hostport>)

操作步骤如下:

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

如果你正在使用一些第三方包,如node express或angular-cli,你需要找到你的机器的IP,并在服务器启动配置中将你的主机附加到该IP(而不是localhost)。然后使用IP从模拟器启动它。例如,我必须使用:ng serve -H 10.149.212.104来使用angular-cli。然后从我使用的模拟器:http://10.149.212.104:4200

问题是Android模拟器将10.0.2.2映射到127.0.0.1映射到localhost。所以把你的web服务器配置到服务器上127.0.0.1:54722而不是localhost:54722。这样就行了。

我在Visual Studio上执行IIS Express上的web应用程序时也遇到了同样的问题。要修复它,你需要进入你的项目属性,然后单击调试选项卡,并将http://localhost:[你 PORT]改为http://127.0.0.1:[你 PORT],并将android url设置为http://10.0.2.2:[你 PORT]。这对我很管用。

对于Laravel家园用户: 如果任何人使用Laravel与homestead,您可以在模拟器

中使用192.168.10.10访问应用程序后端

仍然不工作? 另一个好的解决方案是使用ngrok https://ngrok.com/

1)在cmd下执行ipconfig命令

你会得到这样的结果 enter image description here < / p >

3)使用VMWare网卡1的IPv4地址加上端口号

在我的例子中是8080,所以不用localhost:8080

我使用的是192.168.51:8080

enter image description here

做……

运行本地主机后,你得到http://localhost:[port number]/,在这里你找到了你的端口号。

然后从命令中获取您的IP地址,打开windows命令并键入ipconfig enter image description here < / p >

在我的情况下,IP是192.168.10.33,所以我的URL将是http://192.168.10.33(端口:数字]/。 在Android中,工作室使用这个URL作为你的URL。然后在模拟器的手动代理中设置URL和端口号。< / p >

enter image description here

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

我使用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

解释为什么localhost不能从模拟器提供给任何有基本访问问题的人。对于复杂的案例,请阅读其他答案。

问题:模拟器有自己的本地网络和localhost自己映射到模拟器,但不是你的主机!

解决方案:

  1. 将您的服务器绑定到0.0.0.0以使它可用于模拟器的网络
  2. 获取笔记本电脑的外部IP地址:ifconfig命令用于Mac
  3. 在Android(或Flutter应用程序)使用您的外部接口的IP地址,如:192.168.1.10而不是localhost

当我试图从Android模拟器连接到我的IIS . net Webservice时,我也遇到了同样的问题。

  1. 安装npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000到代理IIS快速端口到9000和访问端口9000从模拟器,如"http://10.0.2.2:9000"
原因似乎是默认情况下,IIS Express不允许从网络连接 https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API+or+Web+App+from+across+LAN < / p >

在Android模拟器上访问本地主机

  • 添加来自AndroidManifest.xml的上网权限
    .xml 李<uses-permission android:name="android.permission.INTERNET" /> < / p > < / >

  • 添加android:usesCleartextTraffic="true",更多细节here:

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

ifconfig | grep "inet " | grep -v 127.0.0.1

复制从这一步(A)获得的IP地址

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

  • 现在在android studio中,如果你在代码中使用,你可以替换URL,或者你可以使用从步骤(A)获得的ip地址,并尝试在web浏览器中打开, 像这样http://192.168.0.102:8080/

不要忘记在IP地址后添加PORT,在我的例子中,应用程序运行在8080端口上,所以我添加了在(A)中获得的IP,端口为8080

我不确定这个解决方案是否适用于每个Android模拟器和每个Android SDK版本,但运行下面的方法对我来说是有效的。

adb reverse tcp:54722 tcp:54722

你需要让你的模拟器运行起来,然后你才能在运行的模拟器设备中成功地击中localhost:54722

如果你和Asp一起工作。Net Web API,在项目中的.vs/config文件夹中,根据您的端口设置修改这些行。假设您使用端口1234和物理路径到IIS设置的项目文件夹是“D:\My Projects\ yoursitename”,那么

<site name="YourSiteName" id="1">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="D:\My Projects\YourSiteName" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1234:*" />
</bindings>
</site>

在android studio,访问您的api "http://10.0.2.2:1234"...