从Android模拟器访问localhost:port

时间:2011-07-20 10:38:37

标签: android android-emulator localhost port

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

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

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

25 个答案:

答案 0 :(得分:350)

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

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

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

答案 1 :(得分:51)

默认AVD使用10.0.2.2,Genymotion使用10.0.3.2

答案 2 :(得分:13)

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

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

  

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

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

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

答案 3 :(得分:10)

我通过安装&#34; Conotor by Keyoti&#34;解决了这个问题。在Visual Studio Professional 2015中。 传送带使用启用外部请求的端口(45455)生成REMOTE地址(您的IP)。 例如:

enter image description here

传送带允许您通过网络上的外部平板电脑和手机或Android模拟器测试网络应用程序(不使用#include <stdio.h> #include <string.h> #include <stdlib.h> void reverse_string(char *str) { /* skip null */ if (str == 0) { return; } /* skip empty string */ if (*str == 0) { return; } /* get range */ char *start = str; char *end = start + strlen(str) - 1; /* -1 for \0 */ char temp; /* reverse */ while (end > start) { /* swap */ temp = *start; *start = *end; *end = temp; /* move */ ++start; --end; } } char *read(void) { char *line = malloc(100), *linep = line; size_t lenmax = 100, len = lenmax; int c; if (line == NULL) return NULL; for (;;) { c = fgetc(stdin); if (c == EOF) break; if (--len == 0) { len = lenmax; char *linen = realloc(linep, lenmax *= 2); if (linen == NULL) { free(linep); return NULL; } line = linen + (line - linep); linep = linen; } if ((*line++ = c) == '\n') break; } *line = '\0'; return linep; } int main(void) { printf("Enter a sentence:"); char *sentence = read(); reverse_string(sentence); printf(sentence); return 0; }

步骤如下:

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

答案 4 :(得分:9)

我在Visual Studio上执行IIS Express上的Web应用程序时面临同样的问题。要解决此问题,您需要转到项目属性,然后单击Debug选项卡并将http://localhost:[YOUR PORT]更改为http://127.0.0.1:[YOUR PORT]并将android url设置为http://10.0.2.2:[YOUR PORT]。它对我有用。

答案 5 :(得分:8)

我有一个在我的localhost上运行的网络服务器。

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

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

答案 6 :(得分:6)

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

答案 7 :(得分:3)

您需要将网址设置为10.0.2.2:portNr

portNr = ASP.NET Development Server的给定端口我的当前服务正在localhost:3229/Service.svc上运行

所以我的网址是10.0.2.2:3229

我以这种方式解决了我的问题

我希望它有所帮助...

答案 8 :(得分:3)

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

  

10.4.1 400错误请求

     

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

因此,您与服务器建立了有效连接,但您的请求不符合excet表单。我不知道你是如何创建连接的,包括哪些标题(如果有的话) - 但那就是你要检查的内容。

如果您需要更多帮助,请说明您的代码是什么以及它用于连接服务器的用途,因此我们可以了解全局。

Here是一个同样问题的问题 - 答案是内容类型没有在标题中设置。

答案 9 :(得分:2)

要在Android Emulator上访问localhost

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

  • 添加android:usesCleartextTraffic="true",更多详细信息here

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

ifconfig | grep "inet " | grep -v 127.0.0.1

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

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

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

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

答案 10 :(得分:2)

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

然后从Command处获取IP地址,打开Windows命令并输入ipconfig enter image description here

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

enter image description here

答案 11 :(得分:1)

我不确定该解决方案是否适用于每个Android Emulator和每个Android SDK版本,但是运行以下命令对我来说很成功。

adb reverse tcp:54722 tcp:54722

您需要先启动模拟器,然后才能在运行中的模拟器设备中成功击中localhost:54722

答案 12 :(得分:1)

对于Laravel Homestead用户: 如果有人使用Laravel和宅基地,你可以在模拟器中使用192.168.10.10访问app后端

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

答案 13 :(得分:0)

如果您正在使用 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中,使用“http://10.0.2.2:1234”访问你的api ...

答案 14 :(得分:0)

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

答案 15 :(得分:0)

当我尝试从Android模拟器连接到IIS .NET Web服务时,我遇到了同样的问题。

  1. 安装application.yml
  2. # Libs import discord # Version 1.2.5 from discord.ext import commands # set discord API token token = "MASKED" # Initiate used objects bot = commands.Bot(command_prefix="!") @bot.event async def on_member_join(member): print(f"{member} has joined the server.") for channel in member.server.channels: if str(channel) == "general": await bot.send_message(f"""Welcome to the server {member.mention}""") bot.run(token) 代理IIS Express端口到9000,并从仿真器访问端口9000,例如npm install -g iisexpress-proxy

原因似乎是默认情况,IIS Express不允许来自网络的连接 https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API+or+Web+App+from+across+LAN

答案 16 :(得分:0)

说明为什么localhost对于有基本访问问题的人无法从仿真器中获得。对于复杂的案例,请阅读其他答案。

问题:仿真器拥有本地局域网,并且localhost会将自己映射到仿真器,但没有您的主机!

解决方案:

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

答案 17 :(得分:0)

我正在使用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启动模拟器。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

1)在cmd中运行ipconfig命令

2)你会得到这样的结果 enter image description here

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

在我的案例中它是8080,所以不使用localhost:8080

我正在使用192.168.56.1:8080

enter image description here

完成.....

答案 20 :(得分:0)

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

答案 21 :(得分:0)

localhost似乎在我的模拟器中正常工作,然后我开始获得连接拒绝异常 我从模拟器浏览器使用了127.0.2.2并且它工作,当我在我的模拟器中的Android应用程序中使用它时它再次开始显示连接被拒绝的问题。

然后我做了ifconfig,我使用了ip 192.168.2.2,它运行得很好

答案 22 :(得分:0)

当服务层使用Visual Studio IIS Express时,我解决了问题。只是指向10.0.2.2:port不会工作。我没有像其他帖子所提到的那样弄乱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

答案 23 :(得分:0)

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

您需要找到与您连接的设备/仿真器相关的机器IP。对于仿真器,请遵循以下步骤;

  1. 转到VM虚拟框 - &gt;在列表中选择已连接的设备。
  2. 选择设置 - &gt;网络 - &gt;找出设备连接到哪个网络。对我来说,它是'VirtualBox Host-Only Ethernet Adapter#2'。
  3. 在virtualbox中,转到Files-&gt; Preferences-&gt; Network-&gt; Host-Only Networks,找出上述步骤中指定的网络的IPv4。 (通过悬停你会得到信息)
  4. 提供此IP以从模拟器访问localhost。端口与运行/发布服务时提供的端口相同。

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

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

答案 24 :(得分:-1)

您可以在Windows任务管理器中的“性能”选项卡中查找所需的IP(按ctrl + alt + del)。 。