Java - сбой связи - PullRequest
       2

Java - сбой связи

0 голосов
/ 01 сентября 2010

Я только что говорил со своим хостом, на котором у меня есть веб-страница, и они говорят, что разрешают соединения JDBC.

Во всяком случае, страница, на которой вы можете просмотреть это http://mystikrpg.com/mysqltest/mysqltry.html

Вот моя ошибка:

**** Looking for database...
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2308)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2122)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:774)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:375)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at test.init(test.java:38)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission [0:0:0:0:0:0:0:1]:4464 connect,resolve)
    at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:407)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:268)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:292)
    ... 16 more
java.lang.NullPointerException
    at test.init(test.java:69)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.NullPointerException

и вот код:

Что я делаю не так?

//package mysqltest;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.TextArea.*;
import java.sql.*;
import java.util.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.net.*;
import java.applet.*;

public class test extends JApplet
{
    public JTextArea c;
    public void init()
    {
        c = new JTextArea();
        add(c);
        c.append("**** Looking for database...");
        Connection conn = null;
        Properties props = new Properties();
        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "mystik";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "";
        String loggedusername = getParameter("name");
        boolean online = false;
        try
        {
            Class.forName(driver).newInstance();
            online = true;
            if (online)
            {
                // if user loads applet online
                conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");
            }
            else
            {
                // for localhost - testing purposes props.put("user", "root");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mystik", props);
            }
            c.append("\nConnected to the database");
            c.append("\nGetting stats for: " + loggedusername);
            PreparedStatement statement = conn.prepareStatement( "select * from `user` where `username` = '"+loggedusername+"'");
            ResultSet result = statement.executeQuery();
            // just a dumb mysql statement! while(result.next())
            {
                c.append("\nUsername: "+result.getString(2)+ "\nLevel: "+result.getString(6)+"\nEXP: "+result.getString(8)+"\n");
            }
            PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666' where `username` = '"+loggedusername+"'");
            updateEXP.executeUpdate();
            ResultSet xresult = statement.executeQuery();
            while(xresult.next())
            {
                c.append("\nUsername: "+xresult.getString(2)+ "\nLevel: "+xresult.getString(6)+"\nEXP: "+xresult.getString(8)+"\n");
            }

            c.append("\nDisconnected from database");
        }
        catch (Exception e)
        {
            System.out.println(c.getText());
            e.printStackTrace();
        }finally {
            try {
            conn.close();
        }catch(SQLException dan) {dan.printStackTrace(); }
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 01 сентября 2010

Цитирование вашего кода:

  // if user loads applet online
  conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");

Апплет - это программа, работающая на компьютере пользователя, где находится браузер. Таким образом, localhost относится к машине пользователя на этом этапе. Скорее всего, большинство пользователей не запускают MySQL на своих компьютерах, что даже если бы они были, это не был бы тот, за которым следовал ваш апплет, и что он все равно вышел бы из изолированной среды апплета.

РЕДАКТИРОВАТЬ (после обсуждения в комментариях):

Из обсуждений и комментариев в предыдущих связанных вопросах видно, что вы пытаетесь подключиться напрямую к своему серверу MySQL из приложения (апплета), распространяемого среди клиентов, которые могут быть где угодно, что обычно является неправильным подходом.

  • Вы были обеспокоены размещением своего имени пользователя / пароля в своих примерах. Это лишь небольшая проблема по сравнению с тем, что могло бы случиться, если бы вы широко распространили свой апплет: тогда любой мог легко просмотреть трафик, отправленный вашим приложением на ваш сервер MySQL, и получить имя пользователя / пароль.
  • Большинство серверов MySQL заблокированы от внешнего доступа, в основном из-за того, что они не обеспечивают надлежащего контроля доступа по сравнению с требованиями доступа всего приложения. Это не всегда так, но управление доступом к самим операциям INSERT / SELECT / UPDATE часто слишком грубое, чтобы представлять функциональное назначение всего приложения.

В большинстве служб, использующих базу данных, управление пользователями и контроль доступа осуществляется на уровне приложений, а не на уровне базы данных. Это особенно верно, когда вы используете поставщика общего доступа, который создает базу данных и учетную запись пользователя для всего приложения, даже если вам нужно несколько пользователей.

Типичным обходным путем для этого является разработка другой службы (обычно веб-службы), которую будет вызывать ваш клиент, предоставляя подходящий контекст аутентификации и использования для различных операций, которые вы хотите, чтобы клиент выполнял с данными.

Я не уверен, что ваш хостинг позволяет вам запускать сервисы Java, но более дешевые провайдеры хостинга, как правило, позволяют вам запускать сервисы PHP, Perl и / или Python, поэтому вы можете написать сервис на одном из этих языков и иметь свой Апплет будет клиентом, который с ними разговаривает.

Объяснение того, как писать веб-сервисы, вероятно, выходит за рамки этого вопроса / ответа. В общем, вы, вероятно, встретите 3 категории: веб-сервисы в стиле REST (это архитектурный стиль, управляемый понятием ресурсов и представлений), XML-RPC (часто называемый «REST» по ошибке, куда вы отправляете фрагменты XML для некоторой веб-страницы, которая будет вызывать функцию / метод и давать вам некоторые результаты в ответ; вы можете сделать то же самое с JSON) и SOAP (где вы, вероятно, получите больше инструментов, но также можете быть более раздутыми в зависимости от того, что вам удобно). Были продолжающиеся дебаты о том, что лучше, но это зависит от вас, чтобы исследовать и выбрать то, что вы считаете лучшим для вашего приложения. Вероятно, это будет зависеть от того, что можно развернуть на вашем хосте.

0 голосов
/ 01 сентября 2010

NPE - потому что Connection conn никогда не инициализируется - вот что взрывается.

Я бы порекомендовал вам использовать средство подключения к базе данных (например, MySQL Workbench ), чтобы установить правильный URL-адрес из вашей системы на mystikrpg.com; как только у вас будет правильный URL, вы можете поместить его в апплет.

Как указано @Bruno, апплет работает локально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...