Ich habe mal mit RMI begonnen. Gestern habe ich das ganze auch tatsächlich mal zum laufen gebracht! Heute läuft meine Applikation aber schon bereits nicht mehr.
Die ganze Anwendung ist etwa so aufgebaut:
Package "client"
-Klasse "Client"
Package "common"
-Interface "Summierer"
Package "server"
-Klasse "Server"
Nun die Implementierungen:
Client:
Summierer:
Server:
"homews3" ist übrigens der Name meines Rechners, ich kann ihn auch unter diesem Namen sauber anpingen.
Ich habe diese Klassen sauber codiert, habe dann ins Projekt-Root Verzeichnis gewechselt und folgendermassen kompiliert:
Das ganze hat prima funktioniert, die Klassen sind sauber erstellt worden. Also bin ich mit folgendem Schritt weitergefahren:
Nun wurde die Datei "Server_Stub.class" erstellt. Scheint also ebenfalls funktioniert zu haben. Bleibt nur noch das freigeben des Ports:
Dies funktioniert auch. So, nun will ich den Server ausführen, indem ich folgendes ausführe:
Ergebnis:
Das verstehe ich einfach nicht! Die Stub-Klasse liegt ja im server-Package und sollte doch gefunden werden! Ich habe auch einmal ein ganzes jar-Archiv erstellt und mithilfe der manifest-Datei die Klasse server.Server als Main-Class angegeben. Das Ergebnis ist genau das gleiche (im .jar war Client jedoch nicht drinne).
Folgende Konfiguration habe ich:
OS: Ubuntu 5.10 mit Linux Kernel 2.6.12
JDK: 1.5_05 (installiert unter /usr/java/current/)
java.policy habe ich mit dem Eintrag "permission java.security.AllPermission;" ergänzt, denn vorher sind immer berechtigungsspezifische Exceptions geworfen wurden.
Mein CLASSPATH ist leer, das müsste aber nichts ausmachen, oder?
Ich habe den Server schon als superuser und als normaler user mit /jre/bin/java und /bin/java ausgeführt, es passiert immer das gleiche.
Kann mir bitte jemand helfen? Ich bin am durchdrehen (gestern ist das Teil noch gelaufen)!!!
EDIT:
Ich habe das ganzen auch schon auf meiner Windows-Kiste versucht! Da wurden genau die gleichen Exceptions geworfen (identische JDK- und policy- Konfiguration).
Die ganze Anwendung ist etwa so aufgebaut:
Package "client"
-Klasse "Client"
Package "common"
-Interface "Summierer"
Package "server"
-Klasse "Server"
Nun die Implementierungen:
Client:
Code:
package client;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import common.Summierer;
public class Client
{
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
try
{
Summierer summierer = (Summierer)Naming.lookup("rmi://homews3:1010/Server");
int result = summierer.summieren(16, 35);
System.out.println(result);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
Summierer:
Code:
package common;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Summierer extends Remote
{
int summieren(int a, int b) throws RemoteException;
}
Server:
Code:
package server;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import common.Summierer;
public class Server extends UnicastRemoteObject implements Summierer
{
private static final long serialVersionUID = 1L;
public Server() throws RemoteException
{
}
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
try
{
Server server = new Server();
Naming.bind("rmi://homews3:1010/Server", server);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
public int summieren(int a, int b) throws RemoteException
{
return (a + b);
}
}
"homews3" ist übrigens der Name meines Rechners, ich kann ihn auch unter diesem Namen sauber anpingen.
Ich habe diese Klassen sauber codiert, habe dann ins Projekt-Root Verzeichnis gewechselt und folgendermassen kompiliert:
Code:
javac common/*.java client/*.java server/*.java
Das ganze hat prima funktioniert, die Klassen sind sauber erstellt worden. Also bin ich mit folgendem Schritt weitergefahren:
Code:
rmic server.Server
Nun wurde die Datei "Server_Stub.class" erstellt. Scheint also ebenfalls funktioniert zu haben. Bleibt nur noch das freigeben des Ports:
Code:
rmiregistry 1010
Dies funktioniert auch. So, nun will ich den Server ausführen, indem ich folgendes ausführe:
Code:
java server.Server
Ergebnis:
Code:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: server.Server_Stub
Das verstehe ich einfach nicht! Die Stub-Klasse liegt ja im server-Package und sollte doch gefunden werden! Ich habe auch einmal ein ganzes jar-Archiv erstellt und mithilfe der manifest-Datei die Klasse server.Server als Main-Class angegeben. Das Ergebnis ist genau das gleiche (im .jar war Client jedoch nicht drinne).
Folgende Konfiguration habe ich:
OS: Ubuntu 5.10 mit Linux Kernel 2.6.12
JDK: 1.5_05 (installiert unter /usr/java/current/)
java.policy habe ich mit dem Eintrag "permission java.security.AllPermission;" ergänzt, denn vorher sind immer berechtigungsspezifische Exceptions geworfen wurden.
Mein CLASSPATH ist leer, das müsste aber nichts ausmachen, oder?
Ich habe den Server schon als superuser und als normaler user mit /jre/bin/java und /bin/java ausgeführt, es passiert immer das gleiche.
Kann mir bitte jemand helfen? Ich bin am durchdrehen (gestern ist das Teil noch gelaufen)!!!
EDIT:
Ich habe das ganzen auch schon auf meiner Windows-Kiste versucht! Da wurden genau die gleichen Exceptions geworfen (identische JDK- und policy- Konfiguration).