Zum Inhalt springen

RMI Activatable - puh!


Sia

Empfohlene Beiträge

Oh man, jetzt wirds echt kompliziert.

Eigentlich will nur mein Client nicht starten, sonst ist alles in Ordnung.

Ich beschrieb mal, was ich gemacht habe:

(unter W2K)

Mein Remote-Interface *RemoteServer*


package rmitest;

import java.rmi.*;

public interface RemoteServer extends Remote {

// Definition der Methoden, die dem Client zur Verfügung gestellt werden sollen
public int getTest1()
throws RemoteException;

public int getTest2(int newB)
throws RemoteException;

public void setTest1(int newA)
throws RemoteException;

}
[/PHP]

Meine Implementation davon:

[PHP]
package rmitest;

import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
import java.rmi.activation.*;

public class Server extends Activatable implements RemoteServer {

//Klassen-Variable
int a = 0;
int b = 0;

//Constructor
/*public Server() throws RemoteException {
super();
}*/
public Server(ActivationID id, MarshalledObject data) throws RemoteException {
super(id, 0);
}

//Implementation der Methoden, die dem Client zur Verfügung gestellt werden sollen
public int getTest1() {
print(getClientName() + ": getTest1 - return a = " + a);
return a;
}

public int getTest2(int newB) {
b = newB;
print(getClientName() + ": getTest2(" + newB + ") - return 6/b = " + 6/b);
return 6/b;
}

public void setTest1(int newA) {
print(getClientName() + ": setTest1(" + newA + ")");
a = newA;
}

private void print(String toPrint) {
System.out.println(toPrint);
}

//Klassen-interne Methoden
private String getClientName() {
String clientName = "Unknown Client-IP";
try {
clientName = java.rmi.server.RemoteServer.getClientHost();
clientName = InetAddress.getByName(clientName).getHostName();
}
catch(java.rmi.server.ServerNotActiveException se) {
System.err.println(se);
}
catch(java.net.UnknownHostException se) {
System.err.println(se);
}
return clientName;
}
}

Die Setup-Klasse:


package rmitest;

import java.rmi.*;
import java.rmi.activation.*;
import java.util.Properties;

public class Setup {

public static void main(String[] args) throws Exception {

System.setSecurityManager(new RMISecurityManager());

Properties props = new Properties();
props.put("java.security.policy", "rmitest/java.policy");

ActivationGroupDesc.CommandEnvironment ace = null;
ActivationGroupDesc testGroup = new ActivationGroupDesc(props, ace);

ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(testGroup);

String location = "file:./";

MarshalledObject data = null;

ActivationDesc desc = new ActivationDesc (agi, "rmitest.Server", location, data, true);

RemoteServer mri = (RemoteServer)Activatable.register(desc);
System.out.println("Got the stub for the Server");

Naming.rebind("Test", mri);
System.out.println("Exported Server");

System.exit(0);
}

}
[/PHP]

Und der Client:

[PHP]
package rmitest;

import java.rmi.*;

public class Client {

private static RemoteServer server;

//Implementation der Methoden
public static int getTest1() {
int a = 0;
try {
a = server.getTest1();
}
catch(Exception ex) {
System.err.println(ex);
}

return a;
}

public static int getTest2(int newB) {
int b = 0;
try {
b = server.getTest2(newB);
}
catch(Exception ex) {
System.err.println(ex);
}

return b;
}

public static void setTest1(int newA) {
try {
server.setTest1(newA);
}
catch(Exception ex) {
System.err.println(ex);
}

}

private static void testMethode() {
try {
int a = 4;
//Anfragen an Server
setTest1(a);
System.out.println("1)getTest1(): " + getTest1());
System.out.println("1)getTest2(2): " + getTest2(2));

}
catch( Exception e ) {
System.err.println( "Exception: " + e );
}
}

//Verbindung zum Server erstellen
public static void main(String[] args) {

//Security Manager erzeugen und setzen
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}

//Verbindung über Registry zum Server herstellen
try {
server = (RemoteServer)Naming.lookup("//134.102.95.10/Test");
}
catch(Exception ex) {
System.err.println(ex);
}

testMethode();
}
}

Ein java.policy-file hab ich auch:


grant
{
permission java.lang.RuntimePermission "setFactory";
permission java.net.SocketPermission "127.0.0.1:*", "accept, connect, listen, resolve";
permission java.net.SocketPermission "134.102.95.10:*", "accept, connect, listen, resolve";
permission java.net.SocketPermission "134.102.95.17:*", "accept, connect, listen, resolve";
permission java.net.SocketPermission "*.biba.uni-bremen.de:*", "accept, connect, listen, resolve";
};
[/PHP]

Und rmid braucht ja auch eins:

[PHP]
grant {
permission com.sun.rmi.rmid.ExecPermission
"d:\\JavaSoft\\jdk1.3.1_01\\bin";

permission com.sun.rmi.rmid.ExecOptionPermission
"c:\\Dokumente und Einstellungen\\sia\\jbprojects\\rmitest\\classes";
};

Anmerkung: Als ich das Activatable noch nicht eingebaut hatte, da lief alles fehlerfrei.

- Jetzt starte ich die rmiregistry. Sie läuft.

- Ich starte rmid: start rmid -J-Djava.security.policy=rmitest\rmid.policy ...Es läuft

- Ich starte die Setup-Klasse: java -Djava.rmi.server.codebase=file:./

-Djava.security.policy=file:rmitest\java.policy

rmitest.Setup

Es kommt eine Ausgabe: Got the stub for the Server

Exported Server

Soweit korrekt, das soll ja auch ausgegeben werden, wenn keine Fehler ausgeworfen

werden.

Danach sieht man aber nicht, ob der Server noch läuft. Es erscheint einfach wieder die DOS-

Eingabeaufforderung. *blink*

- Jetzt versuche ich den Client zu starten: java -Djava.rmi.server.codebase=file:./

-Djava.security.policy=file:rmitest\java.policy

rmitest.Client

Fast wie beim Server, ist noch alles lokal.

Da passiert es: Ich bekomme eine saftige Fehlermeldung!

java.rmi.activation.ActivateFailedException: failed to activate object; nested exception is:

java.security.AccessControlException: access denied

(com.sun.rmi.rmid.ExecOptionPermission -Djava.security.policy=file:rmitest\java.policy )

java.rmi.activation.ActivateFailedException: failed to activate object; nested exception is:

java.security.AccessControlException: access denied

(com.sun.rmi.rmid.ExecOptionPermission -Djava.security.policy=file:rmitest\java.policy )

1)getTest1(): 0

java.rmi.activation.ActivateFailedException: failed to activate object; nested exception is:

java.security.AccessControlException: access denied

(com.sun.rmi.rmid.ExecOptionPermission -Djava.security.policy=file:rmitest\java.policy )

1)getTest2(2): 0

Liegt das an meinem java.policy- oder rmid.policy-file? Das wär für mich die nahliegenste Erklärung, aber ich weiß nicht, was ich da ändern muss.

Falls sich jemand durch das ganze hier durchfindet und mir weiterhelfen kann, hat er bei unheimlich was gut :-)

Schon mal den allerherzlichsten Dank an diesen lieben Menschen!!!

Eine (mal wieder) ratlose Sia

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...