# RMI über Internet



## Zilchinger (13. Jun 2005)

Hi@all,
ich habe zur Übung einen kleinen Client/Server-Chat programmiert.
Der läuft auch über das LAN ohne Probleme. Ich habe jedoch bei RMI-Anwendungen immer das Problem, das ich sie nie über das Internet zum Laufen bekomme.
Aus Testgründen, habe ich den Router entfernt, alle Firewalls abgeschaltet, die ich besitze, die RMIRegistry an verschiedenen Ports gestartet, jedoch alles ohne Erfolg.

Der Lookup nach dem RemoteObjekt funktioniert noch, wenn ich jedoch eine Methode aufrufen will, bekomme ich nach einer gewissen Zeit ein Connection timeout!!!
Woran kann das liegen?
Das Einzige was ich nicht verwendet habe ist der RMISecurityManager, da habe ich aber gelesen, das dieser nur relevant ist, wenn ich zb Klassen nachladen will, oder auf Files auf dem Server zugreifen will, das mache ich aber nicht. Wie gesagt, im LAN läuft alles problemlos.

Hat vielleicht noch jemand eine Idee, woran das liegen könnte?
Ich wäre sehr dankbar


----------



## Zilchinger (14. Jun 2005)

So habe den SecurityManager mal eingebaut,
geht auch nicht, so langsam gehen mir echt die Ideen aus.... :cry:


----------



## Anselmus (14. Jun 2005)

hi,

wie hast du das denn über da netzwerk hinbekommen? bei geht das leider nicht... mein rmi server läuft unter debian/linux und der client unter win xp pro.


```
Naming.list()
```

funktioniert auf der clientseite noch...


aber wenn ich ein stub haben will kommt folgendes:

mit securitymanager:
	
	
	
	





```
HelloClient exception: access denied (java.net.SocketPermission 192.168.61.1:50000 connect,resolve)

java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.61.1:50000 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 Source)

        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

        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 clientside.HelloWinClient.main(HelloWinClient.java:42)
```

ohne security manager kommt folgendes:
	
	
	
	





```
HelloClient exception: error unmarshalling return; nested exception is:

        java.lang.ClassNotFoundException: serverside.HelloImpl_Stub (no security manager: RMI class loader disabled)

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:

        java.lang.ClassNotFoundException: serverside.HelloImpl_Stub (no security manager: RMI class loader disabled)

        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

        at java.rmi.Naming.lookup(Unknown Source)

        at clientside.HelloWinClient.main(HelloWinClient.java:42)

Caused by: java.lang.ClassNotFoundException: serverside.HelloImpl_Stub (no security manager: RMI class loader disabled)

        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)

        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)

        at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)

        at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)

        at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)

        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)

        at java.io.ObjectInputStream.readClassDesc(Unknown Source)

        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)

        at java.io.ObjectInputStream.readObject0(Unknown Source)

        at java.io.ObjectInputStream.readObject(Unknown Source)

        ... 3 more
```

hast du vielleicht ne ahnung?


----------



## Guest (14. Jun 2005)

Verwende den SecurityManger
	
	
	
	





```
System.setSecurityManager(new SecurityManager());
```
und eine entsprechende Policy-Datei dazu.
Um es einfach zu machen, zuerst mal ohne jegliche Einschränkungen
	
	
	
	





```
grant {
  permission java.security.AllPermission;
};
```
Aufruf des Servers und Clients dann mit
	
	
	
	





```
java -Djava.security.policy=./policy ....
```


----------

