Hallo zusammen!
Ich hab wieder ein Problem mit dem RMI.
Ich möchte ein Server mit einem Client machen. Eigentlich ganz einfach. RMI-PlugIn und so weiter funktioniert alles. Jetzt bin ich daran die RMI-Registry direkt von Java aus zu generieren. Nach mehreren Stunden Recherche möchte ich mich nun an euch wenden.
Folgender Code:
Server:
Client:
Stubs habe ich von Hand kompiliert und sind in bin vorhanden.
Ich bekomme aber immer volgende Fehlermeldung beim Starten des Client nach dem erfolgreichen Start des servers (Service ist zwar im RMI-Explorer vorhanden, es wird jedoch nur der Service angezeigt, nicht die dazugehörigen Methoden, das gibt ein Fehler)
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: de.deployment.server.ConcurrentVersionsSystem.CVSHandlerImpl_Stub (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at de.deployment.Client.connectToRmiRegistry(Client.java:43)
at de.deployment.Client.main(Client.java:34)
Caused by: java.lang.ClassNotFoundException: de.deployment.server.ConcurrentVersionsSystem.CVSHandlerImpl_Stub (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.ibjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
at java.ibjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.ibjectInputStream.readObject(ObjectInputStream.java:339)
... 3 more
ich weiß nicht mehr weiter.
Folgende Fragen habe ich mir gestellt:
wie muss ich die codebase setzen?
kann ich die codebase im JavaProgramm mit setProperty setzen?
wie muss die Classpath-Variable gesetzt sein?
brauche ich einen securityManager?
zur Info: bei der security.policy sind alle Berechitgungen freigegeben.
Wenn ich das Ganze mit dem PlugIn Starte und die Einstellungen richtig mache, geht alles.
Was mache ich also konkret an der Methode connectToRmiRegistry() in dem Server falsch
und was für Startparameter muss ich noch setzen?
Ich hab wieder ein Problem mit dem RMI.
Ich möchte ein Server mit einem Client machen. Eigentlich ganz einfach. RMI-PlugIn und so weiter funktioniert alles. Jetzt bin ich daran die RMI-Registry direkt von Java aus zu generieren. Nach mehreren Stunden Recherche möchte ich mich nun an euch wenden.
Folgender Code:
Server:
Code:
public class Server {
public static void main(String[] args) {
Server server = new Server();
server.startRegistry();
System.out.println("Starte CVS-Service");
new CVSHandlerImpl().start();
// Meldung ausgeben wenn alles gestartet ist
System.out.println("Server ist gestartet");
}
public boolean startRegistry() {
try {
String codebase = "file:/C:/workspace/Deployment_server/";;
System.setProperty( "java.rmi.server.codebase", codebase+"bin/" );
System.setProperty( "java.security.policy", codebase+"server.policy" );
System.setProperty("CLASSPATH", "C:/workspace/Deployment_server/bin/");
System.setSecurityManager( new RMISecurityManager() );
LocateRegistry.createRegistry(DeploymentServerProperties.getRMIPort());
System.out.println("RMI-Registry auf Port " + DeploymentServerProperties.getRMIPort() + " gestartet.");
} catch (RemoteException e) {
System.out.println(DeploymentError.SERVER_RMI_START);
e.printStackTrace();
return false;
}
return true;
}
}
Client:
Code:
public class Client {
public static CVSHandler cvs;
private static int serverPort;
private static String serverName;
private boolean connected = false;
public static void main(String[] args) {
serverPort = DeploymentClientProperties.getServerPort();
serverName = DeploymentClientProperties.getServerName();
Client client = new Client();
client.connectToRmiRegistry();
client.createAndShowGui();
}
public boolean connectToRmiRegistry() {
connected = false;
try {
System.out.println(System.getProperties());
Registry registry = LocateRegistry.getRegistry(serverName,serverPort);
cvs = (CVSHandler) registry.lookup(DeploymentServices.CVSSERVICE);
connected = true;
} catch (AccessException e) {
connected = false;
System.out.println(DeploymentError.CLIENT_ERROR_CONNECT_SERVER);
e.printStackTrace();
} catch (RemoteException e) {
connected = false;
System.out.println(DeploymentError.CLIENT_ERROR_CONNECT_SERVER);
e.printStackTrace();
} catch (NotBoundException e) {
connected = false;
System.out.println(DeploymentError.CLIENT_UNKNOWN_SERVICE);
e.printStackTrace();
}
return connected;
}
public boolean isConnected() {
return connected;
}
public void createAndShowGui() {
if(connected) {
GUI gui = new GUI();
gui.setSize(500, 500);
gui.setLocation(100, 150);
gui.setVisible(true);
}
else {
System.out.println(DeploymentError.CLIENT_UNCONNECTED_SERVER);
}
}
Stubs habe ich von Hand kompiliert und sind in bin vorhanden.
Ich bekomme aber immer volgende Fehlermeldung beim Starten des Client nach dem erfolgreichen Start des servers (Service ist zwar im RMI-Explorer vorhanden, es wird jedoch nur der Service angezeigt, nicht die dazugehörigen Methoden, das gibt ein Fehler)
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: de.deployment.server.ConcurrentVersionsSystem.CVSHandlerImpl_Stub (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at de.deployment.Client.connectToRmiRegistry(Client.java:43)
at de.deployment.Client.main(Client.java:34)
Caused by: java.lang.ClassNotFoundException: de.deployment.server.ConcurrentVersionsSystem.CVSHandlerImpl_Stub (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.ibjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
at java.ibjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.ibjectInputStream.readObject(ObjectInputStream.java:339)
... 3 more
ich weiß nicht mehr weiter.
Folgende Fragen habe ich mir gestellt:
wie muss ich die codebase setzen?
kann ich die codebase im JavaProgramm mit setProperty setzen?
wie muss die Classpath-Variable gesetzt sein?
brauche ich einen securityManager?
zur Info: bei der security.policy sind alle Berechitgungen freigegeben.
Wenn ich das Ganze mit dem PlugIn Starte und die Einstellungen richtig mache, geht alles.
Was mache ich also konkret an der Methode connectToRmiRegistry() in dem Server falsch
und was für Startparameter muss ich noch setzen?
Zuletzt bearbeitet: