Hallo zusammen,
ich habe ein kleineres Problem mit RMI. Ich habe eine ganz einfache beisipelhafte Anwendung siehe Code unten (läuft auch in meiner Entwicklungsumgebung).
Ich würde jetzt gerne den Server in ein ausführbares Server.jar packen, also die IRemoteAdder, RemoteAdder und dazu die IUseAdder.
Außerdem will ich den Client in einem ausführbaren Client.jar haben (IUseAdder und UseAdder)
Soweit ich mich dann noch bezüglich codebase eingelesen habe, kann der Client bei entsprechender Konfiguration des Servers über die codebase das Interface des Servers laden und darüber dann Remote Aufrufe starten. Ist das bis dahin korrekt?
Ich gehe zumindest davon aus, da ich nach langem lesen das so verstehe. Jedenfalls bekomme ich es nicht ganz zum laufen, sonst würde ich ja nicht schreiben. Ich rufe also Server auf mit
java -jar Server.jar -Djava.rmi.server.codebase=file:\\\\C:\\Server.jar -Djava.security.manager -Djava.security.policy=C:\server.policy
und den Client mit
java -Djava.security.manager -jar Client.jar
die server.policy gewährt lediglich vollen Zugriff
Auf dem Client erhalte ich dann eine
kann mir jemand sagen was ich falsch mache? habe ich das grundlegende Konzept falsch verstanden? oder irgendwo beim Aufruf einen Fehler? Ich habe schon alle möglichen Sachen probiert.. mit/ohne security manager, verschiedene syntax bei der codebase angabe... ohne Erfolg
ich habe ein kleineres Problem mit RMI. Ich habe eine ganz einfache beisipelhafte Anwendung siehe Code unten (läuft auch in meiner Entwicklungsumgebung).
Ich würde jetzt gerne den Server in ein ausführbares Server.jar packen, also die IRemoteAdder, RemoteAdder und dazu die IUseAdder.
Außerdem will ich den Client in einem ausführbaren Client.jar haben (IUseAdder und UseAdder)
Soweit ich mich dann noch bezüglich codebase eingelesen habe, kann der Client bei entsprechender Konfiguration des Servers über die codebase das Interface des Servers laden und darüber dann Remote Aufrufe starten. Ist das bis dahin korrekt?
Ich gehe zumindest davon aus, da ich nach langem lesen das so verstehe. Jedenfalls bekomme ich es nicht ganz zum laufen, sonst würde ich ja nicht schreiben. Ich rufe also Server auf mit
java -jar Server.jar -Djava.rmi.server.codebase=file:\\\\C:\\Server.jar -Djava.security.manager -Djava.security.policy=C:\server.policy
und den Client mit
java -Djava.security.manager -jar Client.jar
die server.policy gewährt lediglich vollen Zugriff
Java:
grant {
permission java.security.AllPermission;
};
Auf dem Client erhalte ich dann eine
Java:
java.security.AccessControlException: access denied (java.net.SocketPermission
27.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown
ource)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at UseAdder.<init>(UseAdder.java:14)
at UseAdder.main(UseAdder.java:28)
kann mir jemand sagen was ich falsch mache? habe ich das grundlegende Konzept falsch verstanden? oder irgendwo beim Aufruf einen Fehler? Ich habe schon alle möglichen Sachen probiert.. mit/ohne security manager, verschiedene syntax bei der codebase angabe... ohne Erfolg
Java:
public interface IRemoteAdder extends Remote {
public int add (IUseAdder user, int i1, int i2) throws RemoteException;
// other methods
}
Java:
public class RemoteAdder extends UnicastRemoteObject implements IRemoteAdder {
public RemoteAdder() throws RemoteException {
super();
}
public int add(IUseAdder user, int i, int j) {
return i+j;
}
public static void main(String args[]) {
// Register port for RMI
try{
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (RemoteException e){
System.out.println("Creating registry failed. " + e.getMessage() + ". Rebinding port.");
}
IRemoteAdder server = null;
try{
// Construct server
server = new RemoteAdder();
Naming.rebind("RemoteAdder", server);
}
catch (Exception e){
System.out.println("Binding failed. hier " + e.getMessage());
e.printStackTrace();
}
}
}
Java:
public interface IUseAdder extends Remote {
}
Java:
public class UseAdder extends UnicastRemoteObject implements IUseAdder {
public UseAdder() throws RemoteException {
IRemoteAdder ra;
try {
ra = (IRemoteAdder)Naming.lookup("//localhost:1099/RemoteAdder");
int a=23, b=45;
int result = ra.add(this, a,b);
System.out.println(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String argv[]) {
try{
IUseAdder user = new UseAdder();
}catch(Exception e) {
e.printStackTrace();
}
}
}
Zuletzt bearbeitet: