# Java (J)Applet und und RMI (momentan eher RMI)



## Imunar (7. Okt 2009)

Hallo,
ich habe das forum hier nun einige Stunden durchsucht und verschidene Themen 
über JConnector durchgelesen.

Kommen wir also zu meinem Problem.
Ich habe momentan nur ein Beispiel Applet wo eine Tablle (Jtable) mit Werten angezeigt wird (ok hab ich übernommen)
daraufhin soll dann eine Datenbankverbindung auf einen SQL server von statten gehen
und die daten dort in die Tablle übertragen werden.
Das klappt auch SOLANGE ich das Applet auf dem Rechner wo ich das Programm geschrieben habe im Browser local öffne.

Dort wird die Datenbank ausgelesen und die Daten in die Tabelle übertragen.
So weit so gut.

Nun soll das Applet aber auf einem anderen Rechner laufen.
kopiere ich aber die Dateien auf den Zielrechner ,ändere die verbinungsdaten (user/pwd) rest bleibt gleich.

Kommt zu allererst der bekannte :
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Fehler.

wenn ich im html dann zusätlich das jar file vom Jconnector angebe  mit dem archive-tag
kommt ein :

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.

Fehler.

Nun meine Frage.
Wie stelle ich es an das er auf dem "Server" den treiber richtig laden kann.
da ja der CP zur laufzeit gleich sein soll.
Oder ist es möglich den Connector mit in das Applet zu packen sodass es damit keine Probleme gibt bei einem Umzug auf ein anderes System?

[edit]
um es weiter zu spezifizieren:
am ende soll es möglich sein über einen browser von einem anderen Rechner aus die sql-daten des serves anzusehen (später sollen auswertungen davon vorgenommen werden doch erst muss es ja klappen)
bisher bekomme ich es zwar hin das wenn ich die php/html seite auf dem server direkt öffne das es sich per php anziegen läßt per html nicht.
ich werd hier fast verrückt bei ...
[/edit]

Imu


----------



## L-ectron-X (7. Okt 2009)

Bei Problemen mit Applets immer in die Java-Konsole schauen, welche Fehlermeldungen dort ausgegeben werden.

Sicher ist, dass du Applet und Treiber signieren musst.
In der FAQ gibts ein kleines Tool, das dich unterstützen kann.


----------



## Imunar (7. Okt 2009)

ok das mit dem signieren schau ich mir sofort an.

was ich zu der konsole sagen kann.
wenn ich es auf dem server starte und die daten richtig angezeigt werden
(localhost/db usr pwd geht alles)
und es dann vom externen rechner aus versuche kommt 
"
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.
"

selbst beim löschen des chaches.
(was manches mal ein problem bei der aktuellen darstellung war =_=)


hmm ok signiert wurde.. 
beim ausfürhen vom anderen server wurde auch abgefragt.. doch das selbe ergebnis.
beim ausfürhen vom fremdrechner kommt 

Treiber kann nicht geladen werden: com.mysql.jdbc.Driver
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

allerdings nur auf dem fremdrechner!

Imu


----------



## Imunar (7. Okt 2009)

ich noch mal sorry wegen doppelpost...

eine frage zu den applets
ist es wirklich so das die apolets selbst auf dem client rechner (also dem nicht server)
ausgeführt werden?
und somit das localhost das falsche wäre und er auf dem clientrechner die daten abfragen würde aus einer datenbank?

ist es evlt möglich die datenbankabfrage im php zu erstellen und dann mit dem applet die daten zu holen sodass das das applet nicht selbst auf die daten zugreifen muss aus der datenbank?

Imu


----------



## L-ectron-X (7. Okt 2009)

Imunar hat gesagt.:


> Treiber kann nicht geladen werden: com.mysql.jdbc.Driver
> java.lang.ClassNotFoundException: com.mysql.jdbc.Driver


Wie bindest du das Applet in die Webseite ein?



Imunar hat gesagt.:


> ist es wirklich so das die apolets selbst auf dem client rechner (also dem nicht server)
> ausgeführt werden?


Ganz genau so ist es.



Imunar hat gesagt.:


> ist es evlt möglich die datenbankabfrage im php zu erstellen und dann mit dem applet die daten zu holen sodass das das applet nicht selbst auf die daten zugreifen muss aus der datenbank?


Generell sind Applets, die auf Datenbanken zugreifen Mist. Im Applet müssten die Zugangsdaten auf die Datenbank hinterlegt sein.
Du brauchst also eine Schicht dazwischen, bspw. einen RMI-Server, der die Anfragen an die Datenbank weiterleitet und die Ergebnisse ans Applet zurück gibt.
Mit PHP wäre das auch möglich. Man könnte die Ergebnisse der Abfrage in die Parameter des Applets setzen.


----------



## Imunar (7. Okt 2009)

hmmm ok..
dann muss ich das morgen mal durschauen.
da genau das leider erforderlich ist das die Daten vom Server über das Applet überall im netwerkt aus angesehen werden kann..

vielen Dank schon einmal
und bye (macht nun feierabend)

Imu


----------



## Imunar (8. Okt 2009)

Guten Morgen,

ich habe mir das ganze noch einmal durch den Kopf gehen lassen und wollte dann doch einmal die RMI variante versuchen.

So weit so gut es gibt ja ein sehr gutes Beispiel hier
(von dir)
LINK

nun hab das auch alles so weit wie möglich übernommen und der server startet auch ohne zu meckern.

wenn ich allerdings den client (hier noch nur localhost/127.0.0.1)
und dann 
	
	
	
	





```
String host = "localhost";
		    String text = "test";

		
		    Rmi_Interface remote = (Rmi_Interface) Naming.lookup("//" + host+/echos");
		     String received = remote.getEcho(text);
```

versuche kommt nur:

"
Exception in thread "main" java.rmi.NotBoundException: echos
	at sun.rmi.registry.RegistryImpl.lookup(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at client.Rmi_Client.main(Rmi_Client.java:33)
"

als meldung in eclipse.

wobei dann das :
echos 

eben immer das ist was bei
:

```
Rmi_Interface remote = (Rmi_Interface) Naming.lookup("//" + host+/echos");
```

eingegeben wird.


es heißt aber auch echos im server:

```
Rmi_Interface_Impl echos = new Rmi_Interface_Impl();
	        Rmi_Interface stub = (Rmi_Interface)UnicastRemoteObject.exportObject(echos, 0);
	         
	         Registry registry = LocateRegistry.getRegistry();
	         registry.rebind("Echo", stub);
```


ARGH ok hab den fehler selbst gefunden...
der name war nicht echos sonder "Echo" (siehe 4 Zeilen drüber)..
dummer fehler... 
ok nun gehe ich den test an ob es auch über das netwerk klappt.

[edit2]

Soo nun klappte alles nach ein wenig rumexperementieren kann ich nun daten von der datenbank im server auslesen und übertragen.

Danke noch einmal und solved!
[edit2]


Imu


----------

