RMI Erste Versuche mit RMI... klappt nicht

Djinndrache

Bekanntes Mitglied
Hallo,

ich taste mich langsam an RMI an und krieg nichtmal eine winzige Testverbindung zustande :(

Die tolle Exception die ich kriege:
Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: ServerInterface (no security manager: RMI class loader disabled)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:11)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: ServerInterface (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
	at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	... 40 more

Diese Exception kommt, sobald ich den Client starte (Server läuft!)

Client:
Java:
import java.rmi.Naming;

public class Control {
	void init(String serverAddress) { // <-- zu Testzwecken ist serverAddress "127.0.0.1" (= localhost)
		// Verbindung zum Server herstellen

		String url = "//" + serverAddress + "/MMDS"; // MMDS soll die Serverkennung sein
		try {
			ServerInterface server = (ServerInterface) Naming.lookup(url);
			System.out.println(server.method()); // Ich möchte vom Server etwas zurückbekommen und ausgeben, halt nur ein kleiner Test
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
//...
}

Server:
Java:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server extends UnicastRemoteObject implements ServerInterface {
	Server() throws RemoteException {
		super();
	}

	public static void main(String[] args) {
		try {
			LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
		} catch (RemoteException ex) {
			System.out.println(ex.getMessage());
		}
		try {
			Naming.rebind("MMDS", new Server()); // <-- MMDS = Serverkennung
		} catch (MalformedURLException ex) {
			System.out.println(ex.getMessage());
		} catch (RemoteException ex) {
			System.out.println(ex.getMessage());
		}
	}

	@Override
	public String method() throws RemoteException {
		System.out.println("date received");
		return "transfer successful"; // Text an Client schicken
	}
}

Und das süße kleine Interface:
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ServerInterface extends Remote {
	public String method() throws RemoteException;
}


Ich hoffe ihr könnt mir helfen =(
 

L-ectron-X

Gesperrter Benutzer
Hab schone eine Ewigkeit nichts mehr mit RMI gemacht. Aber wenn ich mir so die Fehlermeldung ansehe, könnte es sein, dass du den RMISecurityManager im Server setzen musst.
Dazu als erste Anweisung in deiner main()-Methode:
Java:
System.setSecurityManager(new RMISecurityManager());
 

Djinndrache

Bekanntes Mitglied
Hallo und danke soweit, hab die Zeile hinzugefügt. Nun beim Starten des Servers jedoch:


Java:
Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkConnect(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)
	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.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Unknown Source)
	at Server.main(Server.java:22)


edit: hatte falsche exception reinkopiert! Jetzt ist es die richtige!
 
Zuletzt bearbeitet:

Djinndrache

Bekanntes Mitglied
Hab mal nach der Exception gegoogelt und gefunden, dass man wohl in der policy-file etwas ändern sollte, von:

Code:
permission java.net.SocketPermission "localhost:1024-", "listen";

zu:

Code:
permission java.net.SocketPermission "localhost:1024-", "listen,connect,accept,resolve";

Ich hab auch die java.policy gefunden und die Änderung durchgeführt, doch das Problem bleibt weiterhin bestehen, Access Denied :(


Signieren in Verbindung mit Java hab ich noch nie gehört, das Stichwort hilft mir leider nicht weiter :(
 

Djinndrache

Bekanntes Mitglied
Rufst du die Policy beim Serverstart auch mit auf? Wenn ja, wie?
Und wie sieht die Policy genau aus?

Öhm.. nein, hab gehofft, dass das irgendwie automatisch von Java geht...

In der policy hab ich nur die eine Zeile geändert.


Code:
// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
	permission java.security.AllPermission;
};

// default permissions granted to all domains

grant { 
	// Allows any thread to stop itself using the java.lang.Thread.stop()
	// method that takes no argument.
	// Note that this permission is granted by default only to remain
	// backwards compatible.
	// It is strongly recommended that you either remove this permission
	// from this policy file or further restrict it to code sources
	// that you specify, because Thread.stop() is potentially unsafe.
	// See the API specification of java.lang.Thread.stop() for more
        // information.
	permission java.lang.RuntimePermission "stopThread";

	// allows anyone to listen on un-privileged ports
	//ORIGINAL: permission java.net.SocketPermission "localhost:1024-", "listen";
	permission java.net.SocketPermission "localhost:1024-", "listen,connect,accept,resolve";

	// "standard" properies that can be read by anyone

	permission java.util.PropertyPermission "java.version", "read";
	permission java.util.PropertyPermission "java.vendor", "read";
	permission java.util.PropertyPermission "java.vendor.url", "read";
	permission java.util.PropertyPermission "java.class.version", "read";
	permission java.util.PropertyPermission "os.name", "read";
	permission java.util.PropertyPermission "os.version", "read";
	permission java.util.PropertyPermission "os.arch", "read";
	permission java.util.PropertyPermission "file.separator", "read";
	permission java.util.PropertyPermission "path.separator", "read";
	permission java.util.PropertyPermission "line.separator", "read";

	permission java.util.PropertyPermission "java.specification.version", "read";
	permission java.util.PropertyPermission "java.specification.vendor", "read";
	permission java.util.PropertyPermission "java.specification.name", "read";

	permission java.util.PropertyPermission "java.vm.specification.version", "read";
	permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
	permission java.util.PropertyPermission "java.vm.specification.name", "read";
	permission java.util.PropertyPermission "java.vm.version", "read";
	permission java.util.PropertyPermission "java.vm.vendor", "read";
	permission java.util.PropertyPermission "java.vm.name", "read";
};
 

L-ectron-X

Gesperrter Benutzer
Nein nein, völlig verkehrt.
Du legst eine Textdatei an. Nenne sie bspw. server.policy und schreibe dort zunächst hinein:
Code:
grant {
   permission java.security.AllPermission;
};

Nur um erst mal die Sache zum Laufen zu bekommen. Einschränken kannst du die Rechte dann wieder, wenn alles funktioniert.

Um dann diese Datei beim Start einzubinden schreibst du dir am besten eine Batchdatei, das ist etwas bequemer, als jedesmal den Kommandozeilenbefehl in die Konsole zu schreiben.
Code:
@echo off
start java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=http://localhost/ -jar Server.jar

Erzeuge dazu am besten eine Jar-Datei bzw. passe die Batchdatei entsprechend an.
 

Djinndrache

Bekanntes Mitglied
Hab ich gemacht, wenn ich jetzt die bat-Datei ausführe, beendet sich java aber entweder sofort wieder, oder es läuft nur im Hintergrund, damit kann ich keinerlei Exceptions mehr verfolgen...

In der Annahme, dass es vielleicht im Hintergrund läuft hab ich den Client gestartet und krieg folgende Exception:

Code:
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
	java.net.ConnectException: Connection refused: 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.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:11)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: 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)
	... 44 more


Ist das gewollt, dass in der Konsole, wenn ich die bat ausführe, direkt den nächsten Command ausführen kann und da nicht mein Server läuft?
 

L-ectron-X

Gesperrter Benutzer
Füge mal am Ende der Batchdatei folgednes ein und starte den Server erneut.
Code:
pause
Schau auch mal in der Prozessliste nach und kille alle Java-Prozesse.

Gibts Fehlermeldungen vom Server?
 

Djinndrache

Bekanntes Mitglied
Dann steht in der Konsole nur "Drücke eine beliebige Taste" und danach terminiert es. Auch zum Zeitpunkt von "pause" gibt es nur einen javaw.exe Prozess und der gehört zu eclipse. Der Server scheint also nicht zu laufen...

Entsprechend keine Fehlermeldungen vom Server und die selbe vom Client


edit:

"start java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=http://localhost/ -jar Server.jar" gibt keine Ausgabe.

"java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=http://localhost/ -jar Server.jar" gibt aus: "Unable to access Server.jar" (aber es ist eine executable jar "Server.jar" im selben Verzeichnis!)
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Ich denke schon, dass der Server läuft. Du solltest zum Test einige
Code:
System.out.println("Methode xxx aufgerufen");
einbauen, um das nachvollziehen zu können.
Also eins nach dem anderen, Schritt für Schritt.
 

Djinndrache

Bekanntes Mitglied
Ah, der Server startet jetzt!

Der Client sagt jetzt beim Starten diese Exception an:

Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: ServerInterface (no security manager: RMI class loader disabled)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:11)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: ServerInterface (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
	at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	... 40 more
 

Djinndrache

Bekanntes Mitglied
Mh jetzt hab ich ein Deja-vu, die Fehlermeldung hatte der client doch schonmal:

Code:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkConnect(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)
	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.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:14)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Wie binde ich die angelegte server.policy-Datei denn jetzt in den Server ein? Vielleicht ist das das Problem


edit: Ach das Einbinden sollte ja durch die batch erledigt sein. Dann hat das aber scheinbar nicht geholfen...
 
Zuletzt bearbeitet:

Djinndrache

Bekanntes Mitglied
Der Server startet jetzt normal und gibt nur seinen println("server started") aus, scheint also soweit in Ordnung zu sein.


Der Client liefert beim starten die oben genannte Exception
 

L-ectron-X

Gesperrter Benutzer
Hmm... der Client hat nun auch den RMISecurityManager?
Dann kannst du mal versuchen, den Client zu signieren. Eigentlich sollte das nicht nötig sein, aber schau mal in die FAQ.
 

L-ectron-X

Gesperrter Benutzer
Sollte dennoch funktionieren, wenn du die entsprechenden Stellen in der Batchdatei anpasst.
Eine andere Idee habe ich erst mal nicht.
 

Djinndrache

Bekanntes Mitglied
Habe die Server.jar jetzt signiert mit der batch. Beim nächsten Start vom Server kam dann ein Windows-Fenster, dass mich gefragt hat ob es eine Verbindung machen darf, hab ich natürlich zugelassen.

Dann hab ich den Client gestartet, er hat aber immernoch genau die selbe Fehlermeldung beim Starten :(
 

L-ectron-X

Gesperrter Benutzer
Ist der Client signiert? Ich glaube in deinem Fall braucht man das noch nicht.

Sorry, dass ich dir so eine schlechte Hilfe bin, aber wie oben erwähnt, sind meine RMI-Kenntnisse etwas eingestaubt. Ich hatte mal ein größeres Projekt, das liegt aber schon 4 Jahre zurück.
 

Djinndrache

Bekanntes Mitglied
Ich hab den client nun auch mit einem Bat-Script signiert, das ändert nichts an der Fehlermeldung beim Starten des Clients. Es ist nach wie vor genau die selbe Exception :(
Beim Client gab es übrigens nichtmal das Windows-Fenster um die Verbindung zuzulassen. Heißt das, dass der Fehler vielleicht noch davor auftritt? Naja, wenn man keine Verbindung aufbauen kann, muss man wohl auch noch nichts zulassen...
 
H

hexx

Gast
Signieren musst du deinen Server und Client (wenn kein Applet im Spiel ist) definitiv nicht. Die Exception sagt eigentlich ziemlich eindeutig, dass etwas mit deiner Security Policy nicht stimmt.

Was du tun solltest:

1. Sowohl im Server als auch im Clienten einen SecurityManager setzen.

Der RMISecurityManager ist depricated [1]. Man soll den Standard SecurityManager verwenden. Du musst also entweder irgendwo direkt am Anfang der Main Methoden einen solchen Aufruf einfügen:

Java:
System.setSecurityManager(new SecurityManager());

oder in der Komandozeile angeben, dass die VM automatisch einen setzen soll:

Code:
java -Djava.security.manager ...

2. Die Policy Datei, die genutzt werden soll angeben.

Leg dir eine Datei mit folgendem Inhalt an

Code:
grant {
    permission java.security.AllPermission;
};

Das gibt den Programmen erst mal alle Permissions. Später kannst du das dann auf die wirklich benötigten Permissions einschränken.

Die Policydatei, musst du dann auch im java Aufruf angeben (sowohl beim Server als auch beim Client)

Code:
java -Djava.security.manager -Djava.security.policy=file://path/to/policy.file

Dann sollte es eigentlich laufen.

[1] RMISecurityManager (Java Platform SE 6)
 
T

tuxedo

Gast
Frage am Rande: Bist du denn gezwungen RMI zu benutzen oder darf's auch was anderes sein?

Aber zum Thema: Mit ein wenige Logoutput oder debugging kannst du die Stelle des Fehlers genauer eingrenzen.
 

Djinndrache

Bekanntes Mitglied
Ich hab dem Server mal viele kleine println's hinzugefügt. Wenn ich ihn einfach über java -jar Server.jar starte, hört er vor der Zeile Naming.rebind() auf und wirft eine Exception àla "Access denied". Wenn ich das batch-Script benutze:

Code:
@echo off
start java -Djava.security.policy=server.policy -Djava.rmi.server.codebase=http://localhost/ -jar MMDS-Server.jar
pause

startet der Server ohne Probleme und auch die println's nach dem Naming.rebind() werden noch ausgegeben.

Dann habe ich das ganze mit dem Client auch versucht, auch so eine bat geschrieben mit angepasstem Dateinamen, aber dem Client reicht das wohl nicht... In beiden Fällen beim Starten des Clients (bat-Datei und java -jar Client.jar) gibt es an folgender Stelle die Exception:

Java:
			System.out.println("Looking up Naming...");
			ServerInterface server = (ServerInterface) Naming.lookup(url);
			System.out.println("Looking up Naming... Done!");

Das erste println kommt, das zweite nicht. Daher muss es die Zeile dazwischen sein, die Mist baut. Die genaue Exception:

Code:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkConnect(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)
	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.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:14)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)




@tuxedo Ja ich muss für dieses Projekt RMI nehmen, das ist nicht meine Entscheidung :( RMI hat sicherlich auch einige interessante Vorteile gegenüber Sockets etc., aber naja... Sobald die Verbindung einmal läuft wird alles auch wieder wesentlich einfacher denke ich. Nur das muss man erstmal schaffen... :(


edit: Der Server scheint übrigens wirklich zu laufen. Wenn ich die server.bat ein zweites Mal ausführe kommt im Server die Exception ala "port already in use". Somit ist nur noch der Client schuld, oder? :)
 
T

tuxedo

Gast
RMI hat sicherlich auch einige interessante Vorteile gegenüber Sockets etc., aber naja...
Naja, meine Anspielung ging eher in Richtung meiner Signatur ;-)

edit: Der Server scheint übrigens wirklich zu laufen. Wenn ich die server.bat ein zweites Mal ausführe kommt im Server die Exception ala "port already in use". Somit ist nur noch der Client schuld, oder? :)

Kannst du die policy-File des Clients nochmal posten?
 

Djinndrache

Bekanntes Mitglied
Oh, hab deine Signatur gar nicht gelesen :p Leider hab ich da für dieses Projekt eh keinen Spielraum, ich werds aber im Hinterkopf behalten, wenn ich mal eigene Wahl hab :)




Ich benutze für beide die "server.policy":

Code:
grant {
   permission java.security.AllPermission;
};

Ist das falsch? Sollen ja einfach nur beide (Client + Server) alle Rechte haben...


Ein Gedanke zum Client:

Java:
String url = "//" + serverAddress + "/MMDS";
ServerInterface server = (ServerInterface) Naming.lookup(url);

Stimmt die URL so überhaupt? Ist "//localhost/MMDS" so richtig? Braucht der nichtmal einen Port oder sowas?



edit:

Ich habe im Clienten jetzt mal die check-Methoden des SecurityManagers umgangen, indem ich ihn so gesetzt habe:

Java:
		System.setSecurityManager(new RMISecurityManager() {
			public void checkConnect(String host, int port) {
			}

			public void checkConnect(String host, int port, Object context) {
			}
		});

Jetzt krieg ich keine access denied exception mehr, dafür folgende Exception:

Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: access to class loader denied
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:22)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: access to class loader denied
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
	at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	... 40 more
Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission localhost:80 connect,resolve)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at sun.rmi.server.LoaderHandler$Loader.checkPermissions(Unknown Source)
	at sun.rmi.server.LoaderHandler$Loader.access$000(Unknown Source)
	... 49 more


Auch die Exception wird in der selben Zeile geworfen wie die vorherige...
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Also ich kenne den Lookup nur so:

Java:
    MyService service = (MyService) Naming.lookup("rmi://" + serverName + "/MyService");

Wenn du hinter dem servernamen (der auch die IP sein kann) kein ":<meinRmiPort>" angibst, dann nimmt er den Default-Port 1099. Wenn du am Server also keinen POrt expliozit angegeben hast, oder der Port dort auf 1099 steht, musst du beim Client nix extra mit angeben.

Würde deshalb mal behaupten deiner URL fehlt vorne nur ein "rmi:" ...

- Alex
 
H

hexx

Gast
Code:
...
Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission localhost:80 connect,resolve)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at sun.rmi.server.LoaderHandler$Loader.checkPermissions(Unknown Source)
	at sun.rmi.server.LoaderHandler$Loader.access$000(Unknown Source)

Läuft denn der angegebene HTTP-Server und liegen die Classdateien im Rootverzeichnis?

Code:
... -Djava.rmi.server.codebase=http://localhost/ ...
 

Djinndrache

Bekanntes Mitglied
Habe der URL mal ein "rmi:" vorgesetzt, ändert aber absolut nichts an der Fehlermeldung...



@hexx
Wieso HTTP-Server? Was will ich auf einmal mit einem HTTP-Server? Ich will doch nur eine kleine RMI-Verbindung haben :( Das kann doch nicht so komplex sein... :(


Wenn ich den Teil "-Djava.rmi.server.codebase=http://localhost/ " aus der bat rausnehme kommt beim Starten des Clients:
Code:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: ServerInterface
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at audioplayer.Control.init(Control.java:22)
	at audioplayer.MP3Player.actionPerformed(MP3Player.java:82)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: ServerInterface
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyInterfaces(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
	at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	... 40 more


Die bat hat mir jemand hier im Thread gegeben, hatte die einfach mal so übernommen wie sie gepostet wurde.
 
Zuletzt bearbeitet:
H

hexx

Gast
RMI ist auf den ersten Blick ein wenig komplex.

Die RMI Implementierung versucht benötigte, aber im lokalen Classpath nicht enthaltende Klassen von der angegeben Codebase zu laden [1]. Das kann, muss aber kein Webserver sein. Eine FileUrl (file://...) geht genauso. In deinem Fall fehlt anscheinend die Klasse
Code:
ServerInterface
im Classpath.

Hier [2] ist ein ganz gutes RMI Tutorial. Schau dir das doch mal an und arbeite es durch.


[1] Dynamic code downloading using Java RMI
[2] Tutorial.pdf kostenlos von Uploading.com herunterladen
 

Djinndrache

Bekanntes Mitglied
Ich habe die ServerInterface.java in beide Projekte eingefügt, war das falsch? Muss ich sie nur dem Server geben und der Client holt sich den Code dann irgendwie extern?

die ServerInterface.java sollte somit in beiden jar-Dateien enthalten sein...
 
H

hexx

Gast
Ich habe die ServerInterface.java in beide Projekte eingefügt, war das falsch? Muss ich sie nur dem Server geben und der Client holt sich den Code dann irgendwie extern?

die ServerInterface.java sollte somit in beiden jar-Dateien enthalten sein...

Wenn du wirklich die Quellcodedatei ServerInterface.java meinst, dann ist das falsch. In die Jars gehören die kompilierten *.class Dateien.

Ansonsten: Arbeite bitte wirklich erst mal das Tutorial durch, da sind alle wichtigen Sachen erklärt. Wenn dabei Probleme auftauchen, kannst du dann hier konkrete Fragen stellen. Du siehst ja selbst, wie schnell das sonst ziemlich komplex wird.
 

Djinndrache

Bekanntes Mitglied
Ich hab jetzt mal mehrere simple RMI Tutorials rausgesucht und eins nach dem anderen durchprobiert. Die meisten gingen nicht, aber irgendwann hab ich dann doch mal eins gefunden das funktioniert. Und es braucht nichtmal policies oder sonst irgendwas.

Dank dem funktionierenden Tutorial klappt jetzt auch mein Verbindungsaufbau.
Ich denke die Zeilen, die die Verbindung aufbauen kopier ich von meinem Projekt hier mal rein, falls nochmal jemand so ein Problem hat:

Client:
Java:
			Registry registry = LocateRegistry.getRegistry(serverAddress);
			this.mp3service = (Mp3Service) registry.lookup("MMDS");

Server:
Java:
			Mp3Service serviceStub = (Mp3Service) UnicastRemoteObject
					.exportObject(this);
			Registry registry = LocateRegistry.getRegistry();
			registry.rebind("MMDS", serviceStub);


Der Rest ist ja klar, Interface bauen und so weiter.


Ich danke allen nochmals für die Hilfbereitschaft in diesem Thread =)
 

r.w.

Bekanntes Mitglied
Hallo zusammen,

den SecurityManager braucht man nicht mehr unbedingt.

Das Problem ist hier beim ServerInterface zu suchen.
Du musst darauf achten, dass es im Client und im Server im gleichen package liegt.

Java:
package rmidemo; // <------ muss im Client und im Server gleich lauten (hier z.B. 'rmidemo')

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

public interface ServerInterface extends Remote {
    public String method() throws RemoteException;
}

Ich hoffe, das hilft Dir weiter.

VG ROlf
 

Ähnliche Java Themen

Neue Themen


Oben