从Android模拟器连接到本地主机/10.0.2.2的连接超时。

18
尽管这个问题在StackOverflow上被问了多次,我也看了很多,但仍然无法解决我的问题,或者我无法找到问题的根本原因。因此,我发布一个新问题。

以下是我查看的链接列表--

  1. 如何从Eclipse中的Android模拟器连接到我的http://localhost Web服务器

  2. 从Android模拟器访问localhost:port

  3. 如何从我的Android设备访问本地主机?

  4. 如何在Android模拟器中连接localhost?

这是我的代码--

protected Void doInBackground(Void... params)
    {
        try
        {
            HttpURLConnection connection = null;

            URL url = new URL("http://10.0.2.2:8080/android_connect/user_registration.php");
            connection = (HttpURLConnection)url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            connection.setConnectTimeout(720000000);
            connection.setReadTimeout(72000000);
            connection.connect();

            OutputStreamWriter output = new OutputStreamWriter(connection.getOutputStream());
            output.write(emp_details.toString());
            output.flush();
            output.close();

            HttpResult = connection.getResponseCode();

            connection.disconnect();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

我正在尝试通过WAMP服务器,使用PHP连接Android和MySQL数据库。PHP文件(user_registration.php)保存在以下路径中--

C:\wamp\www\android_connect

现在在执行代码后,我遇到了一个错误,如下所示:“java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 8080) after 720000000ms: isConnected failed: ETIMEDOUT (Connection timed out)”。
为了解决这个问题,我查看了以下链接: Android连接到本地主机 但是我并没有理解它是如何解决的! :)
请问你能帮我解决这个问题吗?请注意,我正在使用Android Studio进行构建。
提前感谢!
6个回答

11

在Google Android虚拟设备中,只有使用10.0.2.2地址才能将您的Android设备与计算机连接。Android虚拟设备监听10.0.2.2,并将所有请求转发到您的计算机。

Genymotion Android虚拟设备监听10.0.2.3并将请求转发到您的计算机。

真实的Android设备不能使用10.0.2.2进行连接。如果您想要在真实设备上使用该功能,则需要设置您计算机的IP地址,正如之前的答案所建议的。


对于最近版本的Genymotion,它是10.0.3.2,请参见https://dev59.com/52Ml5IYBdhLWcg3wXF9f#18940022。 - Paul Götze

10

我找到了它没有工作的原因。

有两个问题--

  1. IP地址不正确。所以我将IP地址从10.0.2.2改为IPv4地址-可以通过在命令提示符中输入ipconfig来查看Windows上的IP地址,参见此链接以获取Linux上的IP地址。

  2. 另外,端口号8080不正确。我在httpd.conf文件中设置了我的自己的端口号,如下所示:##Listen 12.34.56.78:8383Listen 0.0.0.0:8383Listen [::0]:8383## ,在Apache下使用同样的端口号。

更改这两个问题并重新启动WAMP服务器后,它就像魔法一样运行了。


7
你能解释一下“所以我把IP地址从10.0.2.2改成了IPv4地址”的意思吗?谢谢。 - speedynomads
我在我的代码中使用了10.0.2.2作为我的IP地址,这是不正确的。因此我改成了IPv4地址。然后它开始工作了。 - Saumik Bhattacharya
6
IPv4地址是什么? - speedynomads
6
请打开命令提示符,输入“ipconfig”命令,它会列出IP地址。在这里,您可以找到IPv4地址。 - Saumik Bhattacharya

1

为什么要使用本地主机或任何IP地址在模拟器或真实设备上运行,只需使用ngrok将本地主机转换为全局地址,非常方便和简单。


1

这个问题的被采纳答案真的很不清晰,所以也许这篇文章能帮助到某些人。
我刚刚遇到了同样的问题,并通过执行“adb reverse tcp:8080 tcp:8080”来解决它,尽管在我撤销转发后,主机仍然可见且所有端口都在工作,因此不清楚它是如何工作的。 请确保

  • 您的wifi设置中没有代理
  • 如果有,则添加10.0.2.2以绕过掩码
  • 您没有打错字,有时人们会像这样将0写成2,例如10.0.0.2:8080

问题通过禁用代理解决了。顺便说一下,我找不到在哪里添加IP地址10.0.2.2以绕过它。请分享在设置中添加的位置。 - jfk

0

0

在我的情况下,我在我的安卓设备上运行了这段代码:

private static final String BACKEND_URL = "http://10.0.2.2:4242/"; // 10.0.2.2 is the Android emulator's alias to localhost

但是我的服务器代码运行在我的电脑上。因此,由于我的电脑和我的Android设备不是“同一设备”,所以“http://10.0.2.2:4242/”无法工作。解决方案是将“http://10.0.2.2:4242/”更改为“https://<IP_OF_SERVER>:4242/”


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