# Java RMI auf eigenem Rechner testen?



## serior (19. Juni 2013)

Hallo,

ich habe gerade mir einige RMI Beispiele gesehen und möchte einige von denen testen. Ich weiss aber nicht, wie ich diese Local testen kann, da ich ja nur einen Rechner habe. Weiss jemand wie ich RMI auf mein Rechner Local testen kann?

Vielen Dank im Voraus


----------



## sheel (19. Juni 2013)

Hi

ganz normal?
Nur dass eben beide "Seiten" (Server und Client) am selben Computer ausgeführt werden...


----------



## serior (25. Juni 2013)

Erstmals vielen Dank für deine Antwort.
Ich habe jetzt den Server lauffähig gemacht. Aber leider klappt der Client immer noch nicht. Wenn ich den Client starte, dann kommt AccessControlException.
Ich habe mir alles mögliche durchgelesen, aber komme immer noch zu kein vernünftiges Ergebnis.
Würde mich über jede Hilfe freuen


----------



## Cymatoxa (25. Juni 2013)

Hi,

für eine AccessControlException gibt es viele möglich Ursachen.
Hast du die policy gesetzt? Lass dein Proramm mal mit

```
-J-Djava.security.policy=all.policy
```
laufen. Das ist zwar erst einmal bad practice, weil unsicher, aber gut zum testen.

Schöne Grüße, Cymatoxa


----------



## serior (25. Juni 2013)

Hi und vielen Dank für deine Antwort.
Das, was du angegeben hast, setze ich im Eclipse unter "VM Arguments" oder? Wenn ja, dann sagt er unrecognized action.
ich hatte bei server und client folgende Zeile davor dort angegeben:
-Djava.java.policy="${workspace_loc}java.policy"

Hier ist meine Code, wenn du es brauchen solls:

```
//Die Fassade-Code:

package server;
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface Facade  extends Remote{
	public void getName() throws RemoteException;

}

//Die Fassadeimplementierung-Code:

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

public class FacadeImpl extends UnicastRemoteObject  implements Facade {
	private static final long serialVersionUID = 1L;
	public FacadeImpl() throws RemoteException {
		super();
	}
	public void getName() {
		System.out.println("Mein Name ist ...");
	}
}

//Server-Code:

package server;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RMISecurityManager;
	
public class Server {
  public Server() {}

    public static void main(String args[]) {

        System.setProperty("java.security.policy", "java.policy"); 
        
        if (System.getSecurityManager() == null) { 
            System.setSecurityManager (new RMISecurityManager()); 
            System.out.println("SecurityManager gestartet");
        }
        else{
            System.out.println("SecurityManager laeuft bereits");
        }	
		try {
		    Facade stub = new FacadeImpl();	//Objekt erstellen
	
		    Registry registry = LocateRegistry.createRegistry(1099);
		    registry.bind("Server", stub);	//namensbindung
	            System.out.println("Server angemeldet... ");
	
		} catch (Exception e) {
		    System.err.println("ServerExceptions: " + e.toString());
		    e.printStackTrace();
		}
    }
}
```


```
//Client-Code:

package client1;

import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Facade;

public class Client implements Remote {
	public  String name;
	private Client() {}

	public static void main(String[] args) {	    	
	    	try {
				Registry vRegistry = LocateRegistry.getRegistry("localhost");
				Facade vFacade=(Facade) vRegistry.lookup("Server");
				vFacade.getName();
		} catch (RemoteException e){
				e.printStackTrace();
		} catch (NotBoundException e){
				e.printStackTrace();
		}
     }
}
```


----------



## Cymatoxa (25. Juni 2013)

Hi, hab deinen Server mal laufen lassen.

Ich bekomme auch die AccessControlException, das muss irgendwie an dem RMISecurityManager liegen. Ich muss zugeben, dass ich durch das Security Modell von Java nicht ganz durchblicke, da gibt es andere Experten für 
Wie auch immer ich habe die Codezeilen zum setzen des SecurityManagers mal auskommentiert - und es läuft wunderbar. Nicht einmal die java.security.policy property muss bei mir gesetzt werden.

Lass es mal ohne die entsprechenden Zeilen laufen. Falls es dann immernoch nicht funktioniert, überprüf mal, ob die PATH variable richtig gesetzt ist und die rmiregistry läuft.

Schöne Grüße,
Cymatoxa

Edit:
Warum erbt deine Client Klasse eigendlich von Remote?


----------



## serior (25. Juni 2013)

Hallo Cymatoxa,
ich hatte es bereits ohne Securitymanager hinbekommen. Mir geht es hauptsächlich um den Securitymanager. Ich sitze schon seit Tagen dran, habe es aber nicht lösen können.
Trotzdem vielen Dank.
Weiss nicht was Client von Remote klauen will, aber Remote hat bestimmt in Client nichts zu suchen


----------



## deepthroat (26. Juni 2013)

Hi.

@serior: Du setzt in deinem Code ebenfalls die java.security.policy Property, überschreibst also den Wert den du über die Kommandozeile angegeben hast.

Jedenfalls, den Wert den du da setzt, das ist eine Datei, welche sich im lib\security Verzeichnis deiner JRE Installation befindet.

Wenn du mal da reinschaust, siehst du, dass ausschließlich Standard-Java-Pakete Vollzugriff erhalten.

Du müßtest eine Policy Datei angeben, wo dein Code ebenfalls Vollzugriff erhält.

Siehe z.B. http://docs.oracle.com/javase/tutorial/rmi/running.html


----------

