Hallo,
habe leider folgendes Problem:
Auf einem Serverrechner läuft ein Server-Prozess, dessen Methode via RMI von einem Client-Prozess,
der auf einem anderen Rechner im Netzwerk läuft, aufgerufen wird.
Die RMI-Registry läuft auf dem Serverrechner.
Das Server-Object kann vom Client über die Registry aufgelöst werden, der Zugriff auf eine Methode
wirft allerdings eine Exception.
Die gleiche JAR-Datei liegt auf beiden Rechnern.
Hier der Code...
serverseitig
Datei server.policy
grant codeBase "file:/users/xyz/rmitest/-"
{
permission java.security.AllPermission;
};
Aufruf:
java -cp .:./RmiTest.jar
-Djava.rmi.server.hostname=10.17.146.179
-Djava.security.policy=server.policy
-Djava.security.codebase=file:/users/xyz/rmitest/RmiTest.jar
rmitest.Main
clientseitig:
Datei client.policy
grant codeBase "file:/users/xyz/rmitest/-"
{
permission java.security.AllPermission;
};
Aufruf:
java -cp .:./RmiTest.jar -Dhostname=10.17.146.179
-Djava.security.policy=client.policy
-Djava.security.codebase=file:/users/xyz/rmitest/RmiTest.jar
rmitest.Client
läuft Server und Client auf einem Rechner, funktioniert das ganze - auch ohne SecurityManager,
luafen die Programme auf verschiedenen Rechnern, wirft der Client beim Aufruf der Methode foo()
folgende Exception:
Denke, dass ich hier die Policies bzw. die Verwendung der Codebase wohl nicht verstanden habe:noe:
Bin für jede Hilfe dankbar!
g,
Christian
EDIT:
habe die Object-Referenz, die der Client ausgibt, vorenthalten - dort liegt anscheinend der Fehler:
server: Proxy[Server,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[localhost:41468](remote),objID:[-61e09ca0:12963049d61:-8000, 0]]]]]
warum steht hier localhost und nicht die IP-Adresse des Servers auf dem das Objekt resistiert...
habe leider folgendes Problem:
Auf einem Serverrechner läuft ein Server-Prozess, dessen Methode via RMI von einem Client-Prozess,
der auf einem anderen Rechner im Netzwerk läuft, aufgerufen wird.
Die RMI-Registry läuft auf dem Serverrechner.
Das Server-Object kann vom Client über die Registry aufgelöst werden, der Zugriff auf eine Methode
wirft allerdings eine Exception.
Die gleiche JAR-Datei liegt auf beiden Rechnern.
Hier der Code...
serverseitig
Java:
public interface Server extends Remote
{
static public final String RmiRegistryName = "TestServer";
String foo() throws RemoteException;
}
Java:
public class ServerImpl implements Server
{
public static void main(String[] args) throws Exception
{
if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
final Server server = new ServerImpl();
final Server stub = (Server) UnicastRemoteObject.exportObject(server, 0);
System.err.println("stub: " + stub);
final Registry registry = LocateRegistry.getRegistry(1097);
System.err.println("registry: " + registry);
registry.rebind(Server.RmiRegistryName, stub);
System.err.println("server bound and running...");
}
public Main() {
super();
}
public String foo() throws RemoteException {
System.err.println("foo() called");
return "foo";
}
}
Datei server.policy
grant codeBase "file:/users/xyz/rmitest/-"
{
permission java.security.AllPermission;
};
Aufruf:
java -cp .:./RmiTest.jar
-Djava.rmi.server.hostname=10.17.146.179
-Djava.security.policy=server.policy
-Djava.security.codebase=file:/users/xyz/rmitest/RmiTest.jar
rmitest.Main
clientseitig:
Java:
public class Client
{
public static void main(String[] args) throws Exception
{
if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
final Registry registry = LocateRegistry.getRegistry(System.getProperty("hostname"), 1097);
System.err.println("registry: " + registry);
final Server server = (Server) registry.lookup(Server.RmiRegistryName);
System.err.println("server: " + server);
final String s = server.foo();
System.err.println("server.foo() returned " + s);
}
}
Datei client.policy
grant codeBase "file:/users/xyz/rmitest/-"
{
permission java.security.AllPermission;
};
Aufruf:
java -cp .:./RmiTest.jar -Dhostname=10.17.146.179
-Djava.security.policy=client.policy
-Djava.security.codebase=file:/users/xyz/rmitest/RmiTest.jar
rmitest.Client
läuft Server und Client auf einem Rechner, funktioniert das ganze - auch ohne SecurityManager,
luafen die Programme auf verschiedenen Rechnern, wirft der Client beim Aufruf der Methode foo()
folgende Exception:
Java:
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy0.foo(Unknown Source)
at rmitest.Client.main(Client.java:49)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:520)
at java.net.Socket.connect(Socket.java:470)
at java.net.Socket.<init>(Socket.java:367)
at java.net.Socket.<init>(Socket.java:180)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
... 7 more
Denke, dass ich hier die Policies bzw. die Verwendung der Codebase wohl nicht verstanden habe:noe:
Bin für jede Hilfe dankbar!
g,
Christian
EDIT:
habe die Object-Referenz, die der Client ausgibt, vorenthalten - dort liegt anscheinend der Fehler:
server: Proxy[Server,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[localhost:41468](remote),objID:[-61e09ca0:12963049d61:-8000, 0]]]]]
warum steht hier localhost und nicht die IP-Adresse des Servers auf dem das Objekt resistiert...
Zuletzt bearbeitet: