# RMI probleme



## flip0r (13. Jan 2010)

Hi, 

1.
also erstmal noch eine verständnisfrage zu rmi: wenn ich den rmi server auf einen fremd rechner laufen habe und den client auf einem anderen rechner und dann z.b. 

```
Adder adder = (Adder) registry.lookup( "Adder" );
```
ausführen möchte findet er die klasse Adder logischerweise nicht. muss ich da das interface welches auf dem server liegt auch auf dem client implementieren?

2.
wenn ich das interface vom server in den client implementiere (wo ich mir nicht ganz sicher bin ob das richtig ist?!) und 

```
Adder adder = (Adder) registry.lookup( "Adder" ); 
    System.out.println( adder.add( 47, 11 ) );
```
ausführe bekomme ich folgende fehler:
Connection refused to host: 192.168.1.4; nested exception is: 
	java.net.ConnectException: Connection timed out: connect
	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.invoke(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
	at $Proxy0.add(Unknown Source)
	at Client.main(Client.java:16)
Caused by: java.net.ConnectException: Connection timed out: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(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)
	... 8 more

jedoch ist der server erreichbar weil

```
String[] test = registry.list();
         System.out.println(test[0]);
```
funktioniert und mir Adder zurück gibt.

vielen dank schon mal im vorraus


----------



## tuxedo (14. Jan 2010)

-> Das Remote-Interface musst du lokal nicht implementieren (implementieren=code dafür schreiben!). Es muss im Classpath vorhanden sein.
-> connection timed out: sicher dass der Server auf IP-Adresse 192.168.1.4 lauscht?

Gruß
Alex


----------



## flip0r (14. Jan 2010)

vielen dank schonmal.
sry, dumme frage zu 1. wenn ich den classpath setze muss doch der code lokal vorhenden sein oder?

naja lokal hat der server die 192.168.0.4 ich denke das java nur die lokale ipadresse ausgibt. und die einträge der registry kann ich ja auch abfragen.
außerdem logge ich die connections beim server und erhalte
Jan 14, 2010 3:31:36 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(37)-139.18.181.4: [139.18.181.4: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]


----------



## tuxedo (14. Jan 2010)

Nochmal zum Verständnis:

Du hast ein Interface. Da stehen Methoden drin die du mit RMI remote-mäßig benutzen willst. Nennen wir das Interface mal spasshalber 
	
	
	
	





```
MyRemote
```
.

So, dann hast du einen RMI Server mit einer Registry. Der Registry kannst du nur Instanzen einer Klasse geben. Also musst du eine Klasse bauen die 
	
	
	
	





```
MyRemote
```
 implementiert. Nennen wir diese Klasse 
	
	
	
	





```
MyRemoteImpl
```
.

Und dann hast du einen Client. Der holt sich via lookup von der Registry das Remote-Objekt. Dies ist beim Lookup vom Typ 
	
	
	
	





```
Object
```
 und muss in das passende Interface gecastet werden. Also castest du nach 
	
	
	
	





```
MyRemote
```
.

So, also brauchst du im Classpath des Servers 
	
	
	
	





```
MyRemote
```
 und 
	
	
	
	





```
MyRemoteImpl
```
.

Da den Client die Implementierung nicht interessiert, braucht der Client, zu all dem restlichen Client-Zeugs, nur noch 
	
	
	
	





```
MyRemote
```
 im Classpath und gut ist. Die 
	
	
	
	





```
MyRemoteImpl
```
 braucht er definitiv nicht. 

Soviel dazu. Wenn ein "Connect Timed Out" kommt, dann läuft entweder die Registry am Server nicht, oder eine Firewall droppt die Pakete, oder der Client verbindung nicht zum Server sondern woanders hin.

Ohne Code hilft übrigens nur noch die Glaskugel.


----------

