从 Android 模拟器到 LocalHost/10.0.2.2 的连接超时


Connection to LocalHost/10.0.2.2 from Android Emulator timed out

尽管这个问题在StackOverflow中被问过多次,并且我经历了其中的许多问题,但我仍然无法解决问题,或者我无法找出问题的根本原因。因此,发布一个新问题。

以下是我浏览过的链接列表——

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

  2. 从安卓模拟器访问本地主机:端口

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

  4. 如何在安卓模拟器中连接本地主机?

这是我的代码——

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:在 720000000ms 后无法连接到/10.0.2.2(端口 8080(的错误:isConnected 失败:ETIMEDOUT(连接超时("。

我浏览了特定链接以解决此问题 -

安卓连接到本地主机

但是无法理解它是如何解决的! :)

在这种情况下,你能帮我吗?请注意,我使用的是Android Studio进行构建。

提前感谢!

从Android连接到计算机仅在Google Android虚拟设备上使用10.0.2.2。Android 虚拟设备正在侦听 10.0.2.2,并将所有请求转发到您的计算机。

Genymotion Android 虚拟设备正在侦听 10.0.2.3 并将这些请求转发到您的计算机。

10.0.2.2 不适用于您的真实 Android 设备。如果要将其与真实设备一起使用,则必须设置计算机的IP,正如先前的答案所建议的那样。

我已经找出了它不起作用的原因。有两个问题——

  1. IP 地址不正确。所以我将 IP 地址从 10.0.2.2 更改为 IPv4 地址 - 可以通过在命令提示符下键入 ipconfig 并在 Windows 上获得该地址并查看 Linux 的链接。

  2. 此外,端口号 8080 也不正确。我已经httpd.conf文件中设置了自己的端口号,例如 ##Listen 12.34.56.78:8383Listen 0.0.0.0:8383Listen [::0]:8383##,在阿帕奇和我使用相同。

在更改两者并重新启动 WAMP 服务器后,它就像一个魅力。

为什么要选择本地主机或任何IP地址在模拟器或真实设备上运行,只需让ngrok以非常方便和最简单的方式将本地主机转换为全局地址即可。

这个问题的公认答案确实不清楚,所以也许这会对某人有所帮助.
刚刚遇到了同样的问题并通过执行"adb 反向 tcp:8080 tcp:8080"解决了它,尽管在我撤销转发后,主机仍然可见并且所有端口都在工作,所以不清楚它是如何工作的。确保

  • 您在 WiFi 设置中没有代理
  • 如果有,则添加 10.0.2.2 以绕过不带掩码
  • 你没有打错字,有时人们像这样放 0 而不是 2 10.0。0.2:8080

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

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

但是我的服务器代码在我的电脑上运行。因此,由于我的PC和Android设备"不是同一设备",这就是"http://10.0.2.2:4242/"不起作用的原因。解决方案是将"http://10.0.2.2:4242/"更改为"https://:4242/">

这可能是由 vulkan 引起的。要修复它,您必须在模拟器或 chrome 上关闭 vulkan。

看看这个答案。

https://stackoverflow.com/a/70842795/4825796