Java sql sqlexception network error ioexception socket failed eacces permission denied

#android #sql-server-2008 #database-connection

#android #sql-server-2008 #database-connection

#Android #sql-server-2008 #подключение к базе данных

Вопрос:

Я разрабатываю приложение для Android для подключения SQL Server 2008, и это мой исходный код DBConn.java

 public class DBConn {
    private static Connection conn = null ;
    private static String DRIVER = "net.sourceforge.jtds.jdbc.Driver";
    private static String DB_NAME = "TestDB" ;
    private static String DB_USER = "sa" ;
    private static String DB_PASSWORD = "sa" ;

    public boolean conSqlServer() {
        Log.d("ERR","start connect SQL SERVER") ;

        try {
            Class.forName(DRIVER).newInstance();
            String connString = "jdbc:jtds:sqlserver://192.168.1.100:1433/TestDB; instance=SQLEXPRESS; user=sa;password=sa";
            conn = DriverManager.getConnection(connString);
            Log.d("SUCCESS","Connection successful ");
            return true;
        }
        catch (SQLException e) {
            Log.d("ERR","ERROR CONNECTION 1 = "   e.getMessage());
            e.printStackTrace();
            return false ;
        }
        catch (Exception ex ) {
            Log.d("ERR","ERROR CONNECTION 2 = "   ex.getMessage());
            ex.printStackTrace();
            return false ;
        }
    }
}
 

я вызываю это из MainActivity.java

 public class MainActivity extends ActionBarActivity {
....
....
    DBConn dbconn = new DBConn();
    dbconn.conSqlServer() ;
...
}
 

AndroidManifest.xml

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

но я получил такую ошибку

 java.sql.SQLException: Network error IOException: socket failed: EACCES (Permission denied)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:436)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at com.noh.connectdb.app.core.DBConn.conSqlServer(DBConn.java:35)
at com.noh.connectdb.app.MainActivity.onCreate(MainActivity.java:20)
....
....
 
  • Я запускаю с устройства Android через Wi-Fi
  • Я проверяю соединение, мое устройство может пинговать сервер
  • брандмауэр закрыт
  • открыт порт 1433

может ли кто — нибудь мне помочь?

Комментарии:

1. Подключение к вашей базе данных из вашего приложения — это NOGO. Я не знаю, чего вы пытаетесь достичь, но вместо этого используйте API. если я получил ваше приложение, я могу легко взломать вашу базу данных путем обратного проектирования вашего приложения.

2. я просто пытаюсь подключить sql server из своего приложения, чтобы оно работало или нет, но оно показывает такую ошибку, есть ли способ исправить

Здравствуйте. Много тем перечитал, даже нашёл работающий исходник.
Проблема только в том, что у меня почему-то не подключается к Mysql.

Вот пример ф-ции:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    void connect() {
        try {
            Log.d("My Logs", "Запускаем поток");
            Thread t = new Thread(new Runnable() {
                public void run() {
                        Connection conn = null;
                        String userName = "user";
                        String password = "123456";
                        String url = "jdbc:mysql://10.0.2.2:3306/test";
                        try {
                            System.err.println("Подключаемся");
                            Class.forName("com.mysql.jdbc.Driver").newInstance();
                        } catch (InstantiationException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        try {
                            conn = DriverManager.getConnection(url, userName, password);
                            Log.i("MyLog", "Получилось");
                            Statement s = null;
                            s = conn.createStatement();
                            s.executeQuery("Select from users");
                            ResultSet rs = null;
                            rs = s.getResultSet();
                            while (rs.next()) {
                                int idVal = rs.getInt("id");
                                String nameVal = rs.getString("name");
                                String catVal = rs.getString("model");
                                System.err.println("res: "+catVal);
                            }
                            rs.close();
                            s.close();
                        } catch (SQLException e) {
                            System.err.println("Не получилось"); 
                            e.printStackTrace();
                        }
                        
                      }
                    });
                    t.start();
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("<censored>");
        }
    }

Проделываю через denwer.
Это —

Java
1
2
3
String userName = "user";
String password = "123456";
String url = "jdbc:mysql://10.0.2.2:3306/test";

логин, пароль и адрес:порт/бд.

Порт в php.ini 3306, в эмуляторе при переходе на 10.0.2.2 всё страница грузится.
База test создана. Пользователь тоже.

При запуске приложение не вылетает, доходит до:
conn = DriverManager.getConnection(url, userName, password);
и сразу же попадает в exception:

Java
1
2
3
4
} catch (SQLException e) {
    System.err.println("Не получилось"); 
    e.printStackTrace();
}

Драйвер Class.forName(«com.mysql.jdbc.Driver»).newInstance (); загружается.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

I’m trying to make an Android app communicate with a MySQL database. I get the following error even with the correct permissions set up in the manifest:

java.net.SocketException: socket failed: EACCES (Permission denied) in Android Studio

Here is the AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.biddingapp">

    <uses-configuration android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Here is the MainActivity.java

public class MainActivity extends AppCompatActivity {

    private EditText username;
    private EditText password;
    private Button login;

    Connection con;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        login = (Button)findViewById(R.id.login);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new MainActivity.checkLogin().execute("");
            }
        });
    }

    private class checkLogin extends AsyncTask<String, String, String>{

        String str = null;
        Boolean isSuccess = false;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

        @Override
        protected String doInBackground(String... strings) {
            con = connectionClass(ConnectionClass.user.toString(),ConnectionClass.password.toString(),ConnectionClass.database.toString(),ConnectionClass.server.toString());
            if(con == null){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"Check Internet Connection",Toast.LENGTH_LONG).show();
                    }
                });
                str = "On Internet Connection";
            }
            else {
                try {
                    String sql = "SELECT * FROM users WHERE username = '" + username.getText() + "' AND password = '" + password.getText() + "' ";
                    Statement stmt = con.createStatement();
                    ResultSet rs = stmt.executeQuery(sql);

                    if (rs.next()) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_LONG).show();
                            }
                        });
                        str = "Success";

                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "Check email or password", Toast.LENGTH_LONG).show();
                            }
                        });

                        username.setText("");
                        password.setText("");
                    }
                } catch (Exception e) {
                    isSuccess = false;
                    Log.e("SQL Error : ", e.getMessage());
                }
            }
            return str;
        }
    }

    @SuppressLint("NewApi")
    public Connection connectionClass(String user, String password, String database, String server){
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String connectionURL = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            connectionURL = "jdbc:mysql://localhost/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";
            connection = DriverManager.getConnection(connectionURL);
        }catch (Exception e){
            Log.e("SQL Connection Error : ", e.getMessage());
        }

        return connection;
    }
}

Here is the ConnectionClass.java

package com.example.biddingapp;

import android.annotation.SuppressLint;
import android.os.StrictMode;
import android.util.Log;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionClass {
    public static String user = "androidstudio";
    public static String password = "program";
    public static String database = "users";
    public static String server = "localhost";
}

How can I solve this issue? Is there any better way to do this?

Я пытаюсь заставить приложение Android общаться с базой данных MySQL. Я получаю следующую ошибку даже с правильными разрешениями, установленными в манифесте:

java.net.SocketException: сбой сокета: EACCES (отказано в доступе) в Android Studio

Вот AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.biddingapp">

    <uses-configuration android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Вот MainActivity.java

public class MainActivity extends AppCompatActivity {

    private EditText username;
    private EditText password;
    private Button login;

    Connection con;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        login = (Button)findViewById(R.id.login);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new MainActivity.checkLogin().execute("");
            }
        });
    }

    private class checkLogin extends AsyncTask<String, String, String>{

        String str = null;
        Boolean isSuccess = false;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

        @Override
        protected String doInBackground(String... strings) {
            con = connectionClass(ConnectionClass.user.toString(),ConnectionClass.password.toString(),ConnectionClass.database.toString(),ConnectionClass.server.toString());
            if(con == null){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"Check Internet Connection",Toast.LENGTH_LONG).show();
                    }
                });
                str = "On Internet Connection";
            }
            else {
                try {
                    String sql = "SELECT * FROM users WHERE username = '" + username.getText() + "' AND password = '" + password.getText() + "' ";
                    Statement stmt = con.createStatement();
                    ResultSet rs = stmt.executeQuery(sql);

                    if (rs.next()) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_LONG).show();
                            }
                        });
                        str = "Success";

                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "Check email or password", Toast.LENGTH_LONG).show();
                            }
                        });

                        username.setText("");
                        password.setText("");
                    }
                } catch (Exception e) {
                    isSuccess = false;
                    Log.e("SQL Error : ", e.getMessage());
                }
            }
            return str;
        }
    }

    @SuppressLint("NewApi")
    public Connection connectionClass(String user, String password, String database, String server){
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String connectionURL = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            connectionURL = "jdbc:mysql://localhost/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";
            connection = DriverManager.getConnection(connectionURL);
        }catch (Exception e){
            Log.e("SQL Connection Error : ", e.getMessage());
        }

        return connection;
    }
}

Вот ConnectionClass.java

package com.example.biddingapp;

import android.annotation.SuppressLint;
import android.os.StrictMode;
import android.util.Log;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionClass {
    public static String user = "androidstudio";
    public static String password = "program";
    public static String database = "users";
    public static String server = "localhost";
}

Как я могу решить эту проблему? Есть ли лучший способ сделать это?

3 ответа

Первая строка должна быть: <uses-permission android:name="android.permission.INTERNET" />

Я думаю, вы запускаете приложение в эмуляторе Android и хотите подключиться к серверу sql, работающему на вашем хост-компьютере.

Для подключения с эмулятора Android к машине, на которой работает эмулятор, необходимо использовать IP-адрес 10.0.2.2

Дополнительную информацию вы можете найти здесь


0

mhlnstdt25
6 Янв 2021 в 15:12

Также нужно упомянуть порт.

MySQL работает на порту 3306 на локальной машине.

Сделайте следующее:

connectionURL = "jdbc:mysql://localhost:3306/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";

Кроме того, разрешение на доступ в Интернет необходимо исправить

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


0

Umer Khalid
12 Янв 2021 в 21:33

Понравилась статья? Поделить с друзьями:
  • Java security signatureexception invalid file sign как исправить
  • Java security invalidkeyexception ioexception der input integer tag error
  • Java security invalidkeyexception ioexception algid parse error not a sequence
  • Java security cert certpathvalidatorexception trust как исправить
  • Java runtime error что это