# RMI - Connection Problem



## mavinatic (14. Aug 2010)

Hallo Java Community,

Ich bin drauf und dran mich mi JavaRMI mich einzuarbeiten bei nem simplen Beispiel fängt es aber schon an. Ich bekomme nicht mal eine Methode aufgerufen  Könnt ihr mir helfen da ein paar Tips geben wo es hängt? Sind wirklich nur RMI Basics

MyInterface:

```
package de.ServerDemo.Interfaces;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface NiSConnection extends Remote {
	public int getValue() throws RemoteException;
}
```

ServerImpl.java

```
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import de.ServerDemo.Interfaces.NiSConnection;


public class ServerImpl implements NiSConnection {
	private int value;
	
	public ServerImpl() throws RemoteException {
		this.value = 3;
	}

	@Override
	public int getValue() throws RemoteException {
		// TODO Auto-generated method stub
		return this.value;
	}

}
```

ServerProc

```
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;

import de.ServerDemo.Interfaces.NiSConnection;


public class ServerProc {
	
	public static void main(String[] args) throws RemoteException {
		LocateRegistry.createRegistry( Registry.REGISTRY_PORT ); 
		 
	    ServerImpl server = new ServerImpl(); 
	    NiSConnection stub = (NiSConnection) UnicastRemoteObject.exportObject( server, 0 );  
	 
	    Registry registry = LocateRegistry.getRegistry(); 
	    registry.rebind( "NiSConnection", stub ); 
	 
	    System.out.println( "Server angemeldet" ); 
	}
}
```
t 

Das war die Serverseite, die funktioniert auch noch, aber wenn ich jetzt mit meinem Client connecten will bekomm ich eine Execption:


```
Exception in thread "main" java.rmi.NotBoundException: server
        at sun.rmi.registry.RegistryImpl.lookup(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
        at sun.rmi.transport.Transport$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at client.Main.main(Main.java:30)
```

Mein Client:


```
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws UnknownHostException, IOException, URISyntaxException, NotBoundException {
        // TODO code application logic here
        Registry registry = LocateRegistry.getRegistry();
        NiSConnection adder = (NiSConnection) registry.lookup("server");
        System.out.println( adder.getValue() );
    }
```


Ich komm einfach nicht weiter und verstehs nicht :/ Könnt ihr mir einwenig helfen?


----------



## Michael... (14. Aug 2010)

Server hat gesagt.:
			
		

> ```
> registry.rebind( "NiSConnection", stub );
> ```





			
				Client hat gesagt.:
			
		

> ```
> NiSConnection adder = (NiSConnection) registry.lookup("server");
> ```





			
				Exception hat gesagt.:
			
		

> ```
> Exception in thread "main" java.rmi.NotBoundException: server
> ```


Fällt Dir was auf? ;-)


----------



## mavinatic (14. Aug 2010)

ich binde das Interface wieder ein und frage den server ab!?

aber wenn ich server einbinde bekomme ich folgene Exception:


```
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.lang.ClassNotFoundException: de.ServerDemo.Interfaces.NiSConnection (no security manager: RMI class loader disabled)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at client.Main.main(Main.java:30)
Caused by: java.lang.ClassNotFoundException: de.ServerDemo.Interfaces.NiSConnection (no security manager: RMI class loader disabled)
        at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
        at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        ... 2 more
```


----------



## mvitz (14. Aug 2010)

Wie startest du denn die RMI Registry?

(Oder muss man die mittlerweile nicht mehr extra starten?)


----------



## mavinatic (14. Aug 2010)

LocateRegistry.createRegistry( Registry.REGISTRY_PORT );

Registry registry = LocateRegistry.getRegistry(); 
	    registry.rebind( "server", stub );


----------



## mvitz (14. Aug 2010)

Kurzes googlen nach deiner Fehlermeldung --> Security Tutorial

Du musst also einen RMISecurityManager im Client setzen, und dann beim starten des Clients noch Argumente (Policy File, Codebase) mitgeben.


----------



## mavinatic (14. Aug 2010)

wie ich es nicht verstehe, ich muss ein File einbinden das dem Client alle rechte gibt zb...


```
grant{
	permission java.security.AllPermission;
};
```

Aber das mit der CodeBase versteh ich nicht und kann ich das Policy File nicht in dem Quelltext angeben?


----------



## tuxedo (16. Aug 2010)

```
LocateRegistry.createRegistry( Registry.REGISTRY_PORT );         
       ....
Registry registry = LocateRegistry.getRegistry();
```

Öhm, createRegistry() liefert doch eine Registry zurück (LocateRegistry (Java Platform SE 6)). Warum also weiter unten dann nochmal mit LocateRegistry arbeiten und eine registry "suchen"? Wenn du die oben erzeugte Registry unten nutzt, müsstest du dir den Security-Krempel sparen können.

Also dann so:


```
Registry registry = LocateRegistry.createRegistry( Registry.REGISTRY_PORT );         
       ....
```


Oder eben mal SIMON anschauen 

- Alex


----------

