# Java => Login mit MySQL



## TermOfDay (8. Dez 2010)

Einen wunderschönen Abend.
Seit kurzen wieder arbeite ich etwas mit Java und habe meinen Server/Client Charakter Movement Stream fertig (kurz: Spiel Netzwerk in dem man mit anderen Spielen kann).
Nun habe ich mir etwas über Java + Datenbanken(MySQL in meinem fall) durch gelesen, muss aber feststellen das ich damit irgendwie nich klar komme.
Nun dachte ich mir, dass ich meine App einfach mal zu ner Applet umschreibe (ist ja nicht viel aufwand) und die Datenbank mittels PHP manage.
Zur eigentlichen frage: ob es möglich ist so sessions über PHP in das Applet zu laden?

Oder empfehlt ihr mir eher dies doch über den Java Server + Datenbank anbindung zu managen?
Meine Idee war: 

- Server bekommt Datenbank anbindung.
- Client beschriftet Login Formular und drückt auf "Login" anschließend werden zwei Strings "Username + Password" an den Server geschickt.
- Server nimmt die Strings und gleicht diese mit den Datenbank-Tabellen (equals) beim finden eines passenden Datensatzes werden die Datenbank informationen an den entsprechenden
Clienten zurück gesendet.
- Nun ist der Client eingelogt und wird weiter zu der Charakter Lobby gelotzt.Hier werden die restlichen infos mit eingetragen (bsp.: Charakter Anzahl, Charakter Namen, Charakter Stufen, Charaker Statistiken(Stärke, Verteidigung usw.) items usw.).
- Client sendet während der Sitzung in bestimmten zeitabständen die neuen Daten (erhöhte Daten neue items) zum Server und dieser bearbeitet die Datenbank.
- Beim Verlieren der Verbindung des Clients werden die letzten bekannten Daten nochmal aufgesammelt o. vom clienten gesendet.

Was wäre Einfacher?Und was Sicherer?
Bitte postet Beispiele oder Links, danke euch. =)


----------



## DerEisteeTrinker (9. Dez 2010)

> Nun habe ich mir etwas über Java + Datenbanken(MySQL in meinem fall) durch gelesen, muss aber feststellen das ich damit irgendwie nich klar komme.



Womit kommst du da genau nicht klar?


----------



## Teferi (10. Dez 2010)

Über Java ist eine Datenbankzugriff recht einfach.

Zuerst muss ein Datenbanktreiber geladen werden (für MySQL):

```
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
```
Dann muss eine Verbindung mit der Datenbank eingerichtet werden:

```
String url = "jdbc:mysql://" + hostname + ":" + port + "/" + dbname; 
conn = DriverManager.getConnection(url, user, password);
```
Wobei _user_ und _password_ die Zugangsdaten zur Datenbank sind.

Eine Abfrage oder Zuweisung kannst du so machen:

Abfrage:

```
Statement state = null;
ResultSet result = null;
ArrayList<String> ergebnis = new ArrayList<String>();
state = conn.createStatement();
result = state.executeQuery(query);
if (result.first()) {
	ergebnis.add(result.getString(1));
	while (result.next()) {
		ergebnis.add(result.getString(1));
	}
}
return ergebnis;
```

Zuweisung:

```
Statement state = null;
ResultSet result = null;
state = conn.createStatement();
state.execute(query);
```


----------



## mariusbopp (10. Dez 2010)

ja wie oben schon geschrieben... is jetzt kein hexenwerk aber kurzes googlen führt auch zu einem ergebnis  

mal schnel das hier geschrieben: 
	
	
	
	





```
package datenbank;
import java.sql.*;

public class MeineErsteAbfrage {

static Connection con = null;
static Statement stmt = null;
static ResultSet rs = null;

    public static void main(String args[]) throws InstantiationException, IllegalAccessException {
    try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    }
   catch (ClassNotFoundException e){
    e.printStackTrace();
    System.exit(1);
    }
    try{
    con = DriverManager.getConnection
            ("jdbc:mysql://localhost/test","root","******");//****** durch pw ersetzen
    stmt=con.createStatement();
    rs=stmt.executeQuery
            ("SELECT * FROM test_tabelle");
    while(rs.next()){
        System.out.println("nr: "+rs.getString(1));
        System.out.println("name: "+rs.getString(2));
        System.out.println("name: "+rs.getString(3));
        System.out.println("name: "+rs.getString(4));
        System.out.println("*************************");// optisches trennen der datensätze
    }
    stmt.close();
    con.close();
    }
    catch(SQLException e){
    e.printStackTrace();
    return;
    }
   }
}
```


----------



## tuxedo (10. Dez 2010)

Kleiner Hinweis am Rande: Wenn die Anwendung als Applet läuft, läuft die nicht im Kontext des Webservers, sondern im Kontext des Browsers. Ergo hast du via "localhost" keinen Zugriff auf die MySQL Datenbank die auf dem Webserver läuft.

Wenn der DB-Zugriff via PHP direkt auf dem Webserver erfolgt: vergiss was ich geschrieben habe 

Nebenbei gäbe es aber auch noch das hier: https://jpmdbc.dev.java.net/


----------



## TermOfDay (10. Dez 2010)

Danke an euch!
jpmdbc werde ich mir mal näher ansehen.


----------



## ARadauer (10. Dez 2010)

jpmdbc ... naja... wo hostet du deine seite? 
also bei all-inkl.com kommt man problemlos von aussen auf die db... musst halt einfach den servernamen statt localhost eintragen


----------



## TermOfDay (10. Dez 2010)

Hoste bis jetzt noch garnicht.Teste mit dem Home-Server. 

Ja ich überlege grade sowieso: Sollte ich für einen Gameserver ein Protokoll ala RMI/SIMON nutzen?
Der Server wird ja alle hand an Daten noch senden.
Die einzigste Aufgabe des Servers in diesem moment ist es die Positionen (x, y) an alle anderen aktiven Clients zu senden, nun werden/sollen ja noch das Login rein komm, die Datenbanken Updaten, Sonstige Events abarbeiten.

Sollte ich denn RMI nutzen?Ich habe gehört =P das man damit Methoden sendet/empfängt sobald der Server/Client dannach verlangt, ist das richtig?
Kann man diese auch in gewissen Zeitabständen senden lassen?Und wie Protokolliere ich RMI o. SIMON.
SIMON ist Jünger oder?

Edit: Außerdem wird der Server auch noch den Chat Managen müssen.Vielleicht könnte ich dafür auch einen anderen Server(.java File) nutzen.
Oder lastet es nicht am CPU massig Threads in einer File zu haben?


----------



## tuxedo (14. Dez 2010)

jpmdbc macht natrürlich nur da Sinn, wo man vom Hoster "localhost only" vorgeschrieben bekommt.
Ansonsten kommt man ja direkt drauf und kann sich damit austoben.

Aber davon mal abgesehen: jpmdbc beherrscht auch SSL + Kompression. Aber gut, weiter zum nächsten Thema:



> Ja ich überlege grade sowieso: Sollte ich für einen Gameserver ein Protokoll ala RMI/SIMON nutzen?



Kommt auf das Spiel an. Einen First-Person-Shooter wirst du damit nicht hin bekommen. Zumindest nicht was die Latenzen angeht.

Für kleinere Spiele wo es nicht auf die letzte Millisekunde ankommt sind RPC Techniken wie RMI/Simon/... wohl vertretbar.

Mit RMI und Co. "versendest" du keine Methoden. Du kannst nur quasi über's Netzwerk eine Methode aufrufen und deren Rückgabewert erhalten. Eben so, als ob es die Klasse/Methode lokal gäbe. Die Netzwerkkommunikation und das verwendete Protokoll sind für dich völlig gekapselt. Das heisst du musst dich da nicht drum kümmern. Vom Code her ist es fast nicht sichtbar dass da überhaupt über's Netzwerk kommuniziert wird.

SIMON ist deutlich jünger als RMI und hat hier und da Vorteile gegenüber RMI. 

Hier mal ein Hello-World Codesample: SIMON - Sample helloworld110 - root1.de - Software Engineering

Vor und Nachteile zu RMI: SIMON - Start - root1.de - Software Engineering

Vom Prinzip her tun RMI und SIMON das gleiche. Nur die Umsetzung variiert etwas.

Chat-Server: Was um himmels willen willst du da mit einer File? Mach das ebenfalls mit RMI und Co. und gut ist. Oder geh den harten Weg und implementiere dein eigenes Protokoll. Aber vergiss die Sache mit den Files ganz schnell wieder ;-)


----------



## Chr__Au (21. Apr 2011)

Ich hätte mal eine andere Frage zu Datenbankzugriffen und es lohnt sich nicht einen neuen Beitrag zu eröffnen. Wie ist das mit den Zugangsdaten die sind doch prinzipiell für jeden sichtbar? Oder ist "Dekompilieren" bei Java nicht so einfach?
Ich möchte demnächst nämlich eine App für Android programmieren und Daten in eine Datenbank schreiben damit ich die Daten auf eine PC App synchronisieren kann. 

Vielleicht habt ihr eine gute Lösung die Datenbank Zugangsdaten sicher ins Coding einfließen zu lassen.


----------



## tuxedo (21. Apr 2011)

Das Thema gabs schon gefühlte 1.274563 Milliarden mal. Hast du mal die Forumsuche bemüht?

Aber kurz um: Eine wirklich sichere möglichkeit Zugangsdaten im Source zu verstecken gibt es nicht. Am sichersten ist es die Zugangsdaten vom Anwender eingeben zu lassen, oder die Zugangsdaten nicht auf dem Gerät zu speichern, sondern den DB-Zugang über einen dazwischengeschalteten Server verbergen/schützen. 

- Alex


----------

