# vServer + JavaServer + MySQL?!



## Tomate_Salat (12. Apr 2009)

Hi,

so es ist soweit: ich bin absolut festgefahren. Seit tagen sitze ich mit einem Kumpel daran, aber wir bekommen es einfach nicht hin. Und zwar: ich habe einen bisher einfach strukturierten Server, der auf die lokale MySQL-Datenbank zugreifen soll, der auf meinem Rechner auch funktioniert. 
Bevor ich ihn hochgeladen hab, habe ich noch dem Clienten gesagt, er soll übers Internet auf meinen Server zugreifen, das Funktioniert auch wunderbar. Dann habe ich ihn hochgeladen und bekomme auch Antwort von ihm...NUR! Er ist nicht fähig die Datenbank anzuzapfen :-/ . 
Um eine Connection aufzubauen benutze ich die funktion:


```
// in der main kommt vorher:
Class.forName( "com.mysql.jdbc.Driver" );
// Die Funktion für die Connection
private Connection getConnection() throws SQLException, ClassNotFoundException {
        return DriverManager.getConnection("jdbc:mysql://localhost/msg-2011","[BENUTZERNAME]","[PASSWORT]");
    }
```

Das einzige was er bis jetzt machen soll, ist mir die Aktuelle Anzahl an Einträgen zurückzuliefern. Aber was ich als Antwort bekomme ist immernur:

--- CLIENT START ---
--- AUSGABE START ---
--- AUSGABE ENDE ---
--- CLIENT CLOSE ---

erwartet wird aber

--- CLIENT START ---
--- AUSGABE START ---
Ausgabe: 14
--- AUSGABE ENDE ---
--- CLIENT CLOSE ---

für die vServer-Verwaltung benutze ich Plesk 9.0.1

Der Server greift über Port 5000 zu, den ich für den Input und Output freigegeben habe und liegt im RootVerzeichnis. 

Hoffe Ihr könnt mir helfen , werde noch ein bisschen weiterprobieren, aber habe wenig Hoffnung, dass ich das alleine hinbekomme =(

MFG

Tomate_Salat


----------



## Gelöschtes Mitglied 5909 (12. Apr 2009)

Exception(s)?

ggf mehr code? so kann man recht wenig sagen imo


----------



## HoaX (12. Apr 2009)

Ich Tippe mal dass der MySQL-Server nicht auf dem Loopback lauscht oder der Benutzer nicht existiert/unzureichende Rechte hat.

Aber ne richtige Fehlermeldung wäre natürlich weit besser als im Trüben zu fischen...


----------



## Tomate_Salat (12. Apr 2009)

raiL hat gesagt.:


> Exception(s)?
> 
> ggf mehr code? so kann man recht wenig sagen imo



der Code ist Ok, mir geht es hier mehr um die MySQL-einstellungen. Mir ist klar, dass das hier kein Server-Forum ist, aber ich denke einige werden sicher einen vServer (oder gar einen richtigen Server) haben und die werden das ja bestimmt mal ausgetestet haben.



HoaX hat gesagt.:


> Ich Tippe mal dass der MySQL-Server nicht auf dem Loopback lauscht oder der Benutzer nicht existiert/unzureichende Rechte hat.
> 
> Aber ne richtige Fehlermeldung wäre natürlich weit besser als im Trüben zu fischen...



Hätte ich eine Fehlermeldung, hätte ich auch einen ansatz. Der Benuzter existiert, denn ich habe es a) mit einem php-Script überprüft, der übermittelt mir alle Daten die enthalten sind und b) habe ich den Benutzer angelegt und der User hat rechte, alle Connections anzunehmen (also bei Datenbanken hat er ein %-Zeichen stehen).

Zum Thema Fehlermeldungen: Es gibt einfach keine! Über die Console sehe ich ja die System-ausgaben. Alles was er mir da bringt ist:

---SERVER:START---
87.xxx.xxx.xxx connected
87.xxx.xxx.xxx connection closed

was auch genau das ist, was ich bisher haben will


----------



## Gelöschtes Mitglied 5909 (13. Apr 2009)

Hast du vielleicht noch keine Daten drinn sodass Ausgabe: 14 nicht kommt? Oder verschluckst du irgendwo eine Exception? WIe siet deine Abfrage aus?


----------



## Tomate_Salat (13. Apr 2009)

nein, es sind mehrere Einträge drin. Ich poste einfach mal den ganze Server-Code


```
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Scanner;


// SERVER
public class Init {
    
    
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        @SuppressWarnings("unused")
        Init init   = new Init();
    }
    
    public Init() throws ClassNotFoundException, IOException {
        // Start-markierung
        System.out.println("--- SERVER:START ---");
        // Driver
        Class.forName( "com.mysql.jdbc.Driver" );
        // Sockets
        ServerSocket server = new ServerSocket(5000);
        Socket client       = null;
        
        while(true) {
            try {
                // Client Akzeptieren
                client      = server.accept();
                InetAddress id   = client.getInetAddress();
                System.out.println(id + " >>> Connection started");
                // Connection händeln
                handleConnection(client);
            } catch( Exception e ) {
                e.getStackTrace();
            } finally {
                if(client != null) {
                    System.out.println(client.getInetAddress() + " >>> Connection closed");
                    client.close();
                }
            }
        }
    }
    
    private void handleConnection(Socket client) throws IOException, SQLException, ClassNotFoundException, NoSuchAlgorithmException {
        // Input
        Scanner in = new Scanner( client.getInputStream() );
        // Optionen
        int option = Integer.parseInt( in.nextLine() );
        switch( option ) {
        // Anzahl an Einträgen zurückliefern
        case 0:
            gesamteAnzahl(client);
            break;
        case 1:
            erstelleEintrag(client, in);
            break;
        case 2:
            getNewsEintrag( in.nextInt(), client );
            break;
        case 3:
            login(client, in);
            break;
        }
    }
    
    private void login(Socket client, Scanner in) throws SQLException, ClassNotFoundException, IOException, NoSuchAlgorithmException {
        // Connection herstellen
        Connection con  = getConnection();
        // Statemant erstellen
        Statement stmt  = con.createStatement();
        // Daten empfangen
        String user     = in.nextLine().toUpperCase();
        String pass     = md5( in.nextLine() );
        // Query anlegen
        String query    = "SELECT * FROM member WHERE USER='" + user + "'";
        // Query senden
        ResultSet result= stmt.executeQuery(query);
        // Output
        PrintWriter out = new PrintWriter( client.getOutputStream(), true );
        if( result.next() ) {
            if( result.getString(3).equals(pass) ) {
                out.println( "true" );
            } else {
                out.println( "false" );
            }
        } else {
            out.println("false");
        }
        // Abschließen
        out.close();
        stmt.close();
        con.close();
    }
    
    private void getNewsEintrag(int id, Socket client) throws SQLException, ClassNotFoundException, IOException {
        // Connection herstellen
        Connection con  = getConnection();
        // Statemant erstellen
        Statement stmt  = con.createStatement();
        // Query anlegen
        String query    = "SELECT * FROM news WHERE ID='" + id + "'";
        // Query senden
        ResultSet result= stmt.executeQuery(query);
        // Output
        PrintWriter out = new PrintWriter( client.getOutputStream(), true );
        if( result.next() ) {
            for( int i=1; i<7;i++ ) {
                out.println( result.getString(i) );
            }
        }
        // Abschließen
        out.close();
        stmt.close();
        con.close();
    }

    private void gesamteAnzahl(Socket client) throws SQLException, IOException, ClassNotFoundException {
        // Connection herstellen
        Connection con = getConnection();
        // Statement erstellen
        Statement stmt = con.createStatement();
        // Query anlegen
        String query   = "SELECT * FROM news";
        // Query ausführen / Result abfangen
        ResultSet res  = stmt.executeQuery(query);
        // Startwert
        int i = 0;
        // Schleife zur Erkennung der Anzahl an Einträgen
        while(res.next()) {
            i++;
        }
        // OutputStream öffnen
        PrintWriter out= new PrintWriter( client.getOutputStream(), true );
        // Anzahl an Einträgen zurückliefern
        out.println(i);
        // Closen
        out.close();
        con.close();
        stmt.close();
    }

    private void erstelleEintrag(Socket client, Scanner in) throws SQLException, IOException, ClassNotFoundException {
        // Daten Sammeln
        String AUTOR    = in.nextLine();
        String TITEL    = in.nextLine();
        String CONTENT  = in.nextLine();
        String DATUM    = getDatum();
        // Query erstellen
        String query    = "INSERT INTO news (AUTOR, TITEL, CONTENT, DATUM, SICHTBAR) VALUES ('" + AUTOR + "','" + TITEL + "','" + CONTENT + "','" + DATUM + "','0')";
        // Connection herstellen
        Connection con  = getConnection();
        // Statemant
        Statement stmt  = con.createStatement();
        // Query
        int status = stmt.executeUpdate(query);
        // Output
        PrintWriter out = new PrintWriter( client.getOutputStream(), true );
        out.println("STATUS " + ( ( status == 1 ) ? "Gesendet" : "Fehlgeschlagen"));
        // Connection / Statemant schließen
        con.close();
        stmt.close();
    }
    
    private Connection getConnection() throws SQLException, ClassNotFoundException {
        // MySQL aufbauen
        return DriverManager.getConnection("jdbc:mysql://localhost/msg-2011","[user]","[passwort]");
    }
    
    private String md5(String text) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        char[] charArray = text.toCharArray();
         
        byte[] byteArray = new byte[charArray.length];
         
        for (int i = 0; i < charArray.length; i++)
        byteArray[i] = (byte) charArray[i];
         
        byte[] md5Bytes = md.digest(byteArray);
         
        StringBuffer hexValue = new StringBuffer();
         
        for (int i = 0; i < md5Bytes.length; i++)
        {
        int val = ((int) md5Bytes[i]) & 0xff;
        if (val < 16) hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }
         
       return hexValue.toString();
    }
    
    @SuppressWarnings("deprecation")
    private String getDatum() {
        // Objekt laden
        Date date   = new Date();
        // Datum
        int d       = date.getDay();
        int m       = date.getMonth();
        int y       = date.getYear() + 1900;
        // ZEIT
        int h       = date.getDay();
        int i       = date.getMinutes();
        int s       = date.getSeconds();
        
        // -> String
        String D    = setCostumDatum(d);
        String M    = setCostumDatum(m);
        String Y    = setCostumDatum(y);
        String H    = setCostumDatum(h);
        String I    = setCostumDatum(i);
        String S    = setCostumDatum(s);
        
        return D + "." + M + "." + Y + " " + H + ":" + I + ":" + S;
    }
    
    private String setCostumDatum(int wert) {
        return ( (wert < 10) ? "0" : "")  + wert;
    }


}
```


----------



## n00ki3 (13. Apr 2009)

Erst würd ich die Connection nicht jedesmal neu erstellen,
außerdem gibst du keinen Port an beim Verbindugnsaufbau?
Drittens solltest du die Fehlermeldungen irgendwo mal abfangen
und viertens hoff ich mal der Code ist nur zum testen ("Kostümierte Daten"? Es gibt auch sowas wie DateFormat)

PS: SELECT * FROM news ist ungefähr die langsamste Methode um die Anzahl Zeilen einer Tabelle zu bekommen


----------



## Tomate_Salat (13. Apr 2009)

Ja bin noch neu in Netzwerkaufbau. Den Port gebe ich an: 

```
ServerSocket server = new ServerSocket(5000);
```

oder habe ich was falsch verstanden?

zum P.S.: ich weis, die Methode die ich benutze ist eigentl. nur unvorteilhaft. Aber da ich den Server erstmal stehen haben wollte und lange andere Methoden ausprobiert habe und die mich nicht weiter gebracht haben, habe ich es dann so gemacht.


----------



## Tomate_Salat (1. Mai 2009)

Ok, 
einen Fehler habe ich gefunden...mein Kumpel hatte vergessen den jdbc-Driver zu installieren. Jetzt bekomme ich immerhin schon ein Feedback, dennoch nicht das richtige. Hier der Test-Code:


```
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class Init {
    private Connection connection = null;
    
    public static void main(String[] args) {
        @SuppressWarnings("unused")
        Init init = new Init();
    }
    
    public Init()  {
        try {
            Class.forName( "com.mysql.jdbc.Driver");
            this.connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/msg-2011",[BENUTZER],[PASSWORT]);
            Statement stmt  = (Statement) connection.createStatement();
            ResultSet rs    = stmt.executeQuery("SELECT * FROM news");
            while( rs.next() ) {
                System.out.println( rs.getString(1) );
                System.out.println( rs.getString(2) );    
                System.out.println( );
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

und hier die Fehlermeldung


```
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2120)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at Init.<init>(Init.java:19)
        at Init.main(Init.java:13)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2043)
        ... 13 more
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:209)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
        ... 14 more
```

werde aus dieser nicht ganz schlau, vllt könnt ihr mir ja helfen.


----------



## sparrow (1. Mai 2009)

Wenn man nach der Fehlermeldung hier im Forum sucht kommen gaaaaaaaaaaaaaaaaanz viele Threads.
Ehrlich!
Let me google that for you


----------

