RMI AccessControlException

Status
Nicht offen für weitere Antworten.
J

JulioGracia

Gast
Hi!

Ich versuche gerade ein RMI Server/Client Paar zu programmieren. Für meinen derzeitigen Fehler ist aber soweit ich das sehe nur der Server interessant. Hier ist der Code:
Java:
package rmi;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Arrays;

import common.*;
public class RMIServer extends UnicastRemoteObject implements RMIServerI {


	private static final long serialVersionUID = 1L;
	private int totalMessagesToRcv = -1;
	private int totalMessagesRcv = -1;
	private int[] receivedMessages;

	public RMIServer() throws RemoteException {
	}

	//this method is the one the client "uses"
	public void receiveMessage(MessageInfo msg) throws RemoteException {

		if(totalMessagesRcv==-1){
			totalMessagesToRcv = msg.totalMessages;
			receivedMessages = new int[totalMessagesToRcv];
		}
		receivedMessages[msg.messageNum-1] = msg.messageNum;
		System.out.println("received message number "+msg.messageNum);
		if(msg.messageNum==totalMessagesToRcv){
			System.out.println("received last message");
		}

	}

	public static void main(String[] args) {

		RMIServer rmis = null;
		String localhost = "127.0.0.1";	
		 if (System.getSecurityManager() == null) {
	            System.setSecurityManager(new SecurityManager());
	     }
			try{
				rmis = new RMIServer();
			}
			catch(RemoteException re){
				System.err.println("RMIServerI exception:");
	            re.printStackTrace();
			}
			String serverURL = new String("rmi://" + localhost + "/RMIServer");
			rebindServer(serverURL,rmis);
			System.out.println("Server ready..");

	}

	protected static void rebindServer(String serverURL, RMIServer server) {
		try {
			LocateRegistry.createRegistry(1099); //registry accepts requests on port 1099
		} catch (RemoteException e) {
			System.err.println("remoteException while creating registry");
			e.printStackTrace();
		} 
		try{
			Naming.rebind(serverURL, server);
		}
		catch(MalformedURLException mue){
			System.err.println("name not in appropriate URL format");
			mue.printStackTrace();
		}
		catch(RemoteException re){
			System.err.println("Registry could not be contacted");
			re.printStackTrace();
		}

	}
}
[/Java]


Und das ist der Fehler:
[QUOTE]Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
	at java.security.AccessController.checkPermission(AccessController.java:546)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
	at java.net.Socket.connect(Socket.java:513)
	at java.net.Socket.connect(Socket.java:469)
	at java.net.Socket.<init>(Socket.java:366)
	at java.net.Socket.<init>(Socket.java:180)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
	at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Naming.java:160)
	at rmi.RMIServer.rebindServer(RMIServer.java:92)
	at rmi.RMIServer.main(RMIServer.java:70)
[/QUOTE]

Ich habe im Internet gesucht und da wird immer wieder etwas über die Java Policy file geredet. Ich habe versucht diese mal zu editieren, aber dann wird mir gesagt, dass ich dazu keine Rechte hätte...

Bin für jede Hilfe dankbar,
Julio
 
T

tuxedo

Gast
Bist du an RMI gebunden oder darf's auch was anderes, sehr ähnliches sein?

- Alex
 

L-ectron-X

Gesperrter Benutzer
Ich glaube du musst deinen Server signieren und/oder eine Policy-Datei erstellen und entsprechend beim Start des Servers einbinden.
 
T

tuxedo

Gast
Für ne Localhost-Verbindung? Hab noch keinen RMI-Server signiert. Ging immer ohne.
Aber ohne Policy-File könnt's schon problematisch werden.

- Alex
 
J

JulioG

Gast
Hallo!

Ja, ich bin an RMI gebunden.
Ich musste wirklich eine policy-file einbinden, es funktioniert jetzt :)
 
T

tuxedo

Gast
Für andere Hilfesuchenden wär's toll wenn du preis gibst was nun des Rätsels Lösung war ...

- Alex
 

wizzard16

Mitglied
und wie bindet man das ein? Ich hab leider keine Ahnung :(
mache sowas zum ersten mal

Ich hab den ganzen Code fertig.

Mir fehlt nurmehr das mit der Policy datei
 

L-ectron-X

Gesperrter Benutzer
Es geht auf jeden Fall per Kommandozeile. Es gibt auch eine Lösung per Anweisung im Code, aber ich finde den Thread nicht mehr, wo das besprochen wurde.

Eine Kommandozeile für eine Policy namens policy.all kann so aussehen:
Code:
java -Djava.security.policy=policy.all -Djava.rmi.server.codebase=http://my-domain.com/ RMIServer

Für die Domain kann auch eine IP eingesetzt werden.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben