View Full Version : [Java] RMI: RemoteException..perché?
alexca82
11-06-2005, 14:49
premetto che sono alle prime armi con RMI e Java in generale.
Esercitandomi su RMI per un esame mi scontro sempre nell'eccezione RemoteException e non capisco se è un problema di codice, di pc, di firewall o di chissacosa. Ho provato sia su Win che su Linux, ma ho sempre lo stesso problema. Su entrambi monto la J2SE SDK 1.4.2_08.
I codici in questione sono semplicissimi: un'interfaccia che estende Remote, una classe che implementa tale interfacce, estende UnicastRemoteObject e nel main fa il Naming.bind con il catch di tutte le eccezioni, e un client che non ho ancora fatto andare per questo problema.
L'errore intero è il seguente:
java.rmi.UnexpectedException: undeclared checked exception; nested exception is:
java.lang.ClassNotFoundException: Could not find class (MathServer_Stub) at codebase ()
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:160)
at MathServer.main(MathServer.java:27)
Caused by: java.lang.ClassNotFoundException: Could not find class (MathServer_Stub) at codebase ()
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:350)
... 3 more
qualcuno mi può aiutare a scansare questa eccezione?
ps: non è rmiregistry perché lo faccio partire prima di fare "java MathServer"
dopo aver compilato il programma devi eseguire: rmic MathServer
per generare lo stub a partire dal file class
alexca82
11-06-2005, 15:12
sì, scusa se non l'ho scritto, ma lo faccio...mi sembra strano appunto il fatto che non trovi lo stub
alexca82
11-06-2005, 16:43
mi viene un dubbio...serve mica la J2EE o bisogna smanettare sulla SDK?
theClimber
11-06-2005, 16:44
Che valore ha i configurato per la property java.rmi.server.codebase?
Dovrebbe esserci la URL per scaricare stub e classi. Verifica che se e' un file (file://...) hai i permessi di lettura, se invece e' una url http:// controlla che sia raggiungibile dal client
Ciao
alexca82
11-06-2005, 19:33
Che valore ha i configurato per la property java.rmi.server.codebase?
Dovrebbe esserci la URL per scaricare stub e classi. Verifica che se e' un file (file://...) hai i permessi di lettura, se invece e' una url http:// controlla che sia raggiungibile dal client
Ciao
scusa l'ignoranza :p ...ma come faccio a vedere la property?
theClimber
11-06-2005, 19:47
Devi guardare le property di System:
String value = System.getProperty("java.rmi.server.codebase");
Poi se devi cambiare il valore:
- Lo cambi da codice:
System.setProperty("java.rmi.server.codebase","http://xxxxxx.Nuovo.Valore");
- Lanci la JVM con un parametro aggiuntivo:
java -Djava.rmi.server.codebase=http://xxxxxx.Nuovo.Valore .... gli altri parametri restano uguali
Ciao
alexca82
12-06-2005, 09:45
ok
ho fatto quanto mi hai detto e ho trovato che il valore è null.Che valore devo settarci ora?
sappi che non devo farci chissà cosa; probabilmente userò RMI solo per questo esame e "chi s'è visto s'è visto..".
Grazie
theClimber
12-06-2005, 11:42
Devi mettere la URL che punta alla directory dove ai le classi, opure al file.jar dove hai lo stub. E' una specied di classpath per le invocazioni remote.
Se Client e server sono sulla stessa macchina una url file:///..... va bene, occhio solo ai permessi di accesso al file. Se le macchine sono diverse ti serve un web server dove piazzare i file.
Ciao
alexca82
13-06-2005, 08:44
bene....ora ho problemi di permessi: ecco l'errore
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 S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
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.bind(Unknown Source)
at java.rmi.Naming.bind(Unknown Source)
at AvvioServer.main(AvvioServer.java:18)
...eppure uso System.setSecurityManager(new RMISecurityManager()), il firewall di windows è aperto sulla porta 1099 e la cartella non è in "sola lettura"...non so più che fare
theClimber
13-06-2005, 14:34
Potrebbero essere problemi di policy. Prova a verificare su :
http://java.sun.com/j2se/1.4.2/docs/guide/security/PolicyFiles.html
Dato che il probleme e' sul connect() della socket, potresti iniziare a verificare questa configurazione:
http://java.sun.com/j2se/1.4.2/docs/guide/security/permissions.html#SocketPermission
Ciao
alexca82
14-06-2005, 16:52
ti ringrazio per la disponibilità, ma forse ho risolto (quasi) involontariamente: in casa ho una rete wifi a cui sono connessio 24 ore su 24, e l'accesso a tale rete (non so in che modo) mi "manda in botta" l'rmi. se infatti spengo l'antenna wireless rmi funziona...chissà perché?
grazie ancora..ora guardo le pagine che mi hai consigliato per vedere se c'è qualche possibile risoluzione
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.