Avatar billede backupmand Nybegynder
24. oktober 2001 - 22:23 Der er 10 kommentarer og
1 løsning

RMIClassLoader problem

Hejsa, jeg har sat en ny SecurityManager gennem System og forsøger nu at downloade en stub via en
url - til dette formål gør jeg brug af loadClass i RMIClassLoader-klassen, men jeg får en eller anden UnMarshallException der fortæller mig at klassen ikke kan lokaliseres og det på trods af at jeg bruger localhost. Det er noget lort, hvorfor kan jeg ikke downloade min stub?

Avatar billede sunlock.dk Nybegynder
25. oktober 2001 - 07:39 #1
Lidt kode...?

::sunlock.dk::
Avatar billede logical Nybegynder
25. oktober 2001 - 08:05 #2
Spørgsmål? Du bruger selvfølgelig en RMISecurityManager istedet, men starter du også programmet med:
java -Drmi.server.codebase=file:/C:\\temp\\classes ...
Hvor codebase er tilpasset dit system?
Avatar billede backupmand Nybegynder
25. oktober 2001 - 08:58 #3
Jeg er íkke nået så langt som at køre programmet
med codebase, så jeg vender lige tilbage når jeg har forsøgt mig med RMISecurityManager og codebase. Men hvad er det der ligger i C:\\temp ?? er det policy-filen?

Jeg kunne godt poste kode, men altså det eneste problem er at den ikke vil downloade klassen via
classloaderen, jeg må lige lidt dybere ind i det
Avatar billede backupmand Nybegynder
26. oktober 2001 - 13:23 #4
jeg har fors\'gt mig p[ flg m[de:
grant codeBase\"http://localhost\"
{
permission // osv permissions
}

ville det v;re den rigtige m[de?
Avatar billede logical Nybegynder
27. oktober 2001 - 20:21 #5
Gå ind på følgende url:

http://java.sun.com/docs/books/tutorial

Og læs den tutorial igennem om RMI. Den er så lille, så det kan gøres hurtigt, og den viser lidt om hvad der skal til.
Avatar billede backupmand Nybegynder
27. oktober 2001 - 21:44 #6
Perfekt. Jeg må sige, jeg havde overovedet ikke
tænkt på at \'udnytte\' sun noget mere efter jeg
startede med at rode med rmi. Jeg vil lige læse
det igennem og så give point efterfølgende.
ok?
Avatar billede backupmand Nybegynder
28. oktober 2001 - 22:16 #7
Jeg har fået ny problemstilling:

Mine settings er som følger
Filer der ligger i C:\\Server
ServerFil (fil der implementerer interface og extender UnicastRemoteObject)
Policyfil (hedder policy.txt)
interface (extender java.rmi.remote)
stub-klasse (lavet ud fra ServerFil.class)
skel-klasse (lavet ud fra ServerFil.class)

Filer der ligger i C:\\Client
ClientFil
PolicyFil

Der ligger ingen stub-filer eller interface filer i C:\\Client,
det er meningen at jeg vil være istand til at downloade disse
via localhost også en eller anden default port.

Jeg har compilet alle client/server filer uden problemer
Jeg starter RMIRegistry
Jeg starter Serveren og den venter nu på en client

Jeg starter Clienten, men ....
jeg får en eller anden Exception der fortæller mig at der ikke kan
etableres en forbindelse til 127.0.0.1:1099 eller noget i den
retning.

Jeg kører server filen med flg text:
C:\\jdk1.3\\bin\\java.exe -Djava.rmi.server.codebase=file:/C:\\Server/-Djava.rmi.server.hostname=localhost -Djava.security.policy=policy.txt \"%n\"

og klient filen med flg text:
C:\\jdk1.3\\bin\\java.exe -Djava.rmi.server.codebase=file:/C:\\Client/-Djava.security.policy=policy.txt \"%n\" localhost 20

Hvad har jeg gjort galt?


Avatar billede logical Nybegynder
29. oktober 2001 - 06:40 #8
Kan du evt. wrappe det hele op i en zip fil og sende til mig, så skal jeg kigge på det.
Avatar billede logical Nybegynder
30. oktober 2001 - 10:10 #9
Så fik jeg kigget lidt på din kode.

Det er det sædvanlige problem med policies og properties, men lad mig fortælle, hvad jeg gjorde:

Jeg pakkede det ud hos mig (C:\\temp\\rmi) i bibliotek henholdsvis Server og Client

Gik ned i Server og rettede policy filen til (Kun socket permissions er nødvendig for at binde en server):
grant {
  permission java.net.SocketPermission \"*:1024-65535\", \"connect, accept\";
};
Startede rmiregistry (Husk rmiregistry skal kunne finde stubklasse, f.eks. via classpath)
Startede serveren: java -Djava.security.policy=policy.txt RMIServer

Kiggede på klienten.

klienten startes med java -Djava.rmi.server.codebase=file:///C:\\temp\\rmi\\Server\\ -Djava.security.policy=policy.txt RMIClient

Hvor
codebase = URL, hvor jeg kan download stub koden fra
policy = nødvendige policies til at tilgå binding og codebase

Da codebase er en file url, skulle jeg således have socketpermission (til naming) og filepermission til min file url.
grant {
  permission java.net.socketPermission \"*:1024-65535\", \"connect, accept\";
  permission java.io.FilePermission \"C:\\\\temp\\\\rmi\\\\Server\\\\-\", \"read\";
};

Og så kørte det.

Jeg brugte dog lidt tid, fordi jeg kom til at editere i serverens policy fil, da jeg troede jeg rettede klientens policy fil fordi de begge to hedder policy.txt. Gør mig den tjeneste at kalde dem f.eks. server.policy og client.policy. Det gør det noget nemmere at finde rundt i :-)

Jeg kunne se ud fra dine kommentarer, at du har prøvet lidt af hver :-) Pas på med den engang imellem..

Og som afsluttende bemærkning. Hvis du senere skal sende remote objekter til serveren, skal serveren selvfølgelig kunne loade de stubbe den anden vej, så der tilføjer du selvfølgelig det spejlede scenario.
Avatar billede barbie Nybegynder
03. november 2001 - 12:41 #10
Lige en lille rettelse..

Det er faktisk ret vigtigt at rmiregistry IKKE kan finde klasserne, da den så overrider codebase. Det er i codebase man skal angive stien til class filerne.
Det virker fint så længe server og klient kører på samme maskine, men hvis du på et tidspunkt gerne vil have dem til at køre på to forskellige maskiner vil codebase typisk være en http URL, og så er det upraktisk at codebase insisterer på at det er c:\\server.
når man starter rmiregistry må filerne altså ikke være at finde i classpath, og hvis man starter rmiregistry fra en kommandoprompt må du ikke starte den et sted hvor den kan finde filerne. Feks mens du står i c:\\server.
På det punkt var det altså rigtigt nok det backupmand gjorde :o)

Avatar billede backupmand Nybegynder
03. november 2001 - 21:52 #11
Jeg tildeler hermed nogle points...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester