AccessControlException bei RMI-Bsp

rolex

Grünschnabel
Ich will mich in nächster Zeit mehr mit Verteilten Systemen auseinander setzen.
Darum wollte ich ein kleines RMI-Bsp ausprobieren. Leider läuft es nicht...
Der Client soll den Server veranlassen, Hallo Welt auszugeben!

Hier mal der Code:


//Hello.java

import java.rmi.*;

public interface Hello extends Remote {
public String sayHello() throws java.rmi.RemoteException;
}




//HelloImpl.java

import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() throws RemoteException {
return "Hello, World!";
}
public static void main(String args[]) {
try {
HelloImpl h = new HelloImpl();

Naming.rebind("rmi://localhost/hello", h);
System.out.println("Hello Server ready.");
} catch (RemoteException re) {
System.out.println("Exception in HelloImpl.main: " + re);
} catch (MalformedURLException e) {
System.out.println("MalformedURLException in HelloImpl.main: " + e);
}
}
}



//HelloClient.java

import java.rmi.*;
public class HelloClient {
public static void main(String args[]) {
System.setSecurityManager(new RMISecurityManager());
try {
Hello h = (Hello) Naming.lookup("rmi/hello");
String message = h.sayHello();
System.out.println("HelloClient: " + message);
} catch (Exception e) {
System.out.println("Exception in main: " + e);
}
}
}





Insgesamt brauch ich dann 3 Eingabe-Fenster zum Starten des RMI-Beipiels

1. Fenster

E:\Programmieren\20040805\anders>rmic HelloImpl

Daraufhin bekomm ich die beiden Dateien:
HelloImpl_Skel.class
und
HelloImpl_Stub.class

E:\Programmieren\20040805\anders>rmiregistry


2. Fenster

E:\Programmieren\20040805\anders>java HelloImpl
Hello Server ready.


3. Fenster

E:\Programmieren\20040805\anders>java HelloClient
Exception in main: java.security.AccessControlException: access denied (java.net
.SocketPermission 127.0.0.1:1099 connect,resolve)


Genau daran happerts dann immer! Was mach ich FALSCH?


Wo ich mich jetzt nicht recht auskenne ist:

Stimmt die Aufruf Reihenfolge so?

Wie erstelle ich ein policy file- bzw. was muß da rein und wo muß es abgespeichert werden?

Liegts evtl. daran, dass im Programm was falsch ist?

Liegts an Windows, muß ich da vielleicht was beachten? Win XP!
Firewall hab ich eigentlich abgeschaltet fürs testen...

Vielen Dank für die Hilfe
~rolex
 
Hallo!

Bei mir klappts ohne den SecurityManager:

Verzeichnissstruktur:
Code:
????de
    ????tutorials
        ????hello
            ????client
            ????server

Interface:
Code:
package de.tutorials.hello;

import java.rmi.Remote;

public interface IHello extends Remote{
	public String sayHello() throws java.rmi.RemoteException;
}


Client:
Code:
package de.tutorials.hello.client;

import java.rmi.Naming;

import de.tutorials.hello.IHello;

/**
 * @author Administrator
 * http://www.tutorials.de
 */
public class HelloClient {
	public static void main(String args[]) {
		try {
			IHello h = (IHello) Naming.lookup("rmi://localhost:1099/hello");
			String message = h.sayHello();
			System.out.println("HelloClient: " + message);
		} catch (Exception e) {
			System.out.println("Exception in main: " + e);
		}
	}
}

Server:
Code:
package de.tutorials.hello.server;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import de.tutorials.hello.IHello;

public class HelloServer extends UnicastRemoteObject implements IHello {

	/**
	 * @throws RemoteException
	 */
	protected HelloServer() throws RemoteException {
		super();
	}

	public String sayHello() throws RemoteException {
		return "Hello, World!";
	}

	public static void main(String args[]) {
		try {
			HelloServer h = new HelloServer();
			Naming.bind("hello",h);
			System.out.println("Hello Server ready.");
		} catch (RemoteException re) {
			System.out.println("Exception in HelloImpl.main: " + re);
		} catch (MalformedURLException e) {
			System.out.println("MalformedURLException in HelloImpl.main: " + e);
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Aufruf in der Konsole:

1)Fenster:
rmiregistry

2)Fenster
java de.tutorials.hello.server.HelloServer

Ausgabe:
Hello Server ready.

3)Fenster:
java de.tutorials.hello.client.HelloClient

Ausgabe:
HelloClient: Hello, World!

HTH
Gruß Tom
 
Fast

Hallo Tom!

Danke für die schnelle und richtige antwort. Ja, so funktionierts.
Warum machst Du diese Verzeichnisstruktur? Ich hatte einige Mühe mit compilieren, da muß ich ja im root Verzeichnis sein. Dann kopieren in die jewieligen Verzeichnisse. Dann rmic für den Server aufrufen. War also alles in allem recht kompliziert,

Was mich aber vielmehr interessiert ist, wieso ich die oben genannte Fehlermeldung bekomme- bzw. wie ich die abstellen kann. Ich mach ja, wie geschrieben grad Versuch mit RMI im Allgemeinen- und da muß ich wohl oder übel auch den SecurityManager zum Laufen bringen!
Nix für ungut! Bin echt total glücklich und dankbar, dass ich nun ein Test-Prog hab auf dem ich aufbauen kann.

Merci
~rolex

P.S. wie, bzw. mit was hast Du das programmiert? Ich proge im Moment noch mit TextEditor...

Ist da was empfehlenswert? Einige schwören ja auf Eclipse.
 
Hallo!

Also in meinem Beispiel brauche ich gar nicht den rmic Aufruf ;-)
Als Entwicklungsumgebung verwende ich Eclipse und diese Verzeichnisstruktur hab ich für all meine Beispiele :)

Die Fehlermeldung bekommst du, da du bei Verwendung eines RMISecurity Managers auf dem Client im Verzeichnis %JAVA_HOME%/rje/lib/security eine Datei namens java.policy haben musst welche die jeweiligen notwendigen Berechtigungen enthalt ...

Gruß Tom
 
Zurück