Android设备无法连接到本地主机中的mysql [关闭]

Posted

技术标签:

【中文标题】Android设备无法连接到本地主机中的mysql [关闭]【英文标题】:Android device can't connect to mysql in localhost [closed] 【发布时间】:2021-11-13 11:58:38 【问题描述】:

我正在 android studio 中开发一个 android 应用程序,并且我的本地主机上有一个 mysql 数据库。 我使用的是 XAMPP,所以我使用的是 MariaDB 和 Apache。

当我运行模拟器时,一切正常,但是当我在物理设备中使用该应用程序时,它就不起作用了。

我已打开端口 80 和 3306 并在应用清单中授予权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

android 活动中的 Java(我正在使用 volley 进行 http 请求):

public static void Register(String email,String password,Context context)
    StringRequest request = new StringRequest(Request.Method.POST, "http://xx.xx.x.x/android/register.php",
            new Response.Listener<String>() 
                @Override
                public void onResponse(String response) 

                    User.setEmail(email);
                    User.setPassword(password);
                    Toast.makeText(context, "Registrado con éxito", Toast.LENGTH_SHORT).show();
                    context.startActivity(new Intent(context, MainActivity.class));


                
            ,
            new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 
                    Toast.makeText(context, "Ha ocurrido un error",Toast.LENGTH_SHORT).show();
                
            
    )
        @Override
        protected Map<String, String> getParams() throws AuthFailureError 
            Map<String,String> params = new HashMap<>();
            params.put("email",email);
            params.put("password",password);
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            String date = sdf.format(new Date());
            params.put("date",date);

            return params;
        
    ;

    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(request);

xx.xx.x.x 是我的公共 ip。

注册.php:

<?php

    if ($_SERVER ['REQUEST_METHOD'] == 'POST')

    require_once("db.php");

    $email = $_POST['email'];
    $password = $_POST['password'];
    $date = $_POST['date'];

    $query = "INSERT INTO user (email, password, date) VALUES 
    ('$email','$password','$date')";

    $result = $mysql->query($query);

    if ($result == TRUE)
        echo "user created";
    
    else
        echo "user not created";
    
    $mysql->close();
  

db.php: 我数据库中的用户 rafa 拥有所有权限,可以通过任何地址进行连接。 (我尝试将“localhost”更改为我的公共 ip,但它也不起作用)

<?php


$mysql = new mysqli(
"localhost",
"rafa",
"1234",
"eduk"
);

if ( $mysql->connect_error)
  die( "failed to connect" . $mysql->connect_error);

我得到的错误是:Ljava.lang.StackTraceElement;

我读到了这个问题,人们说我需要一个主机,一切都会很好,但为什么我需要它?

模拟器应该像其他设备一样工作,但不是物理设备,这是唯一的区别。 我可以使用 pyshical 设备访问我的 apache 服务器,问题一定是与数据库的连接或其他问题。 也许我需要使用其他库?

【问题讨论】:

运行 apache 和数据库的 PC 是否有公共 IP,或者 PC 通过私有 IP 连接到路由器,路由器充当 NAT-Gateway?如果是后者:您是否已将路由器配置为将端口803306 转发到运行apache 的PC 和数据库?您是否尝试过在浏览器中调用 php 文件?如果是这样:它有效吗? 您的本地网络无法从 Internet 访问 - 您的路由器会阻止这种情况(除非您使用端口转发对其进行配置)。但请注意:这会将您的本地计算机暴露在互联网上(黑客正在等待...) 如果您使用的是物理设备,则您不再位于 localhost 中,对吗?您提到了您计算机的公共 IP,但我在您的代码中没有看到它。 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! 切勿以明文形式或使用 MD5/SHA1 存储密码! 仅存储使用 PHP 的 password_hash() 创建的密码哈希,然后您可以使用 password_verify() 进行验证。看看这篇文章:How to use password_hash 并了解更多关于bcrypt & password hashing in PHP 【参考方案1】:

我已经解决了在清单上添加这个...

    android:usesCleartextTraffic="true"

【讨论】:

以上是关于Android设备无法连接到本地主机中的mysql [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用 DataGrip 数据库客户端从本地主机连接到 docker 中的 mysql

MySQL Workbench 连接到 AWS,收到错误“无法连接到本地主机”

离线时无法建立与本地主机的连接

EasyPHP 无法连接到本地主机(端口 8080)

wamp mysql无法连接到本地主机

如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?