Buon pomeriggio forum!!
Sto seguendo un corso di programmazione distribuita e ho problemi ad eseguire questo programma che simula un contatore remoto. Inizio a postarvi il codice:
Lato Server:
Interfaccia Counter
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Counter extends Remote
{
int getValue(String from) throws RemoteException;
void sum(String from, int v) throws RemoteException;
}
Classe LocalCounter
public class LocalCounter
{
public LocalCounter(int v)
{
value = v;
}
public synchronized int localGetValue()
{
return value;
}
public synchronized void increment()
{
value++;
}
private int value;
}
Classe RemoteCounter:
public class RemoteCounter extends LocalCounter implements Counter
{
static Logger logger = Logger.getLogger("global");
public RemoteCounter(String n, int v) throws RemoteException
{
super(v);
name = n;
UnicastRemoteObject.exportObject(this);
try
{
Naming.rebind(name, this);
}
catch(Exception e)
{
logger.severe("Problemi con la rebind" + e.getMessage());
e.printStackTrace();
}
String cr = "Nuovo counter creato il: "+ new Date();
accesses.add(cr);
logger.info(cr);
}
public int getValue(String from) throws RemoteException
{
int app = this.localGetValue();
String cr = "getValue da " + from + " (" + new Date() + "): nuovo " + app;
accesses.add(cr);
logger.info(cr);
return app;
}
public void sum(String from, int howMuch) throws RemoteException
{
for(int i = 1; i <= howMuch; i++)
this.increment();
String cr = "sum " + howMuch + " da " + from + " (" + new Date() + "): nuovo " + this.localGetValue();
accesses.add(cr);
logger.info(cr);
}
public String getName()
{
return name;
}
public Vector<String> getAccesses()
{
return accesses;
}
String name;
Vector<String> accesses = new Vector<String>();
}
Classe CounterServer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.Enumeration;
import java.util.Vector;
import java.util.logging.Logger;
public class CounterServer
{
static Logger logger = Logger.getLogger("global");
private static BufferedReader con = new BufferedReader(new InputStreamReader(System.in));
static final String ERRORMSG = "Uhh? non capisco";
public static void main(String args[])
{
String cmd;
if(System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try
{
RemoteCounter cont = new RemoteCounter("Contatore", 0);
System.out.println("Pronto!");
while(!(cmd = ask()).equals("quit"))
{
if(cmd.equals("valore"))
System.out.println("localGetValue:" + cont.localGetValue());
else if(cmd.equals("valore(remoto)"))
System.out.println("getValue: " + cont.getValue("Server"));
else if(cmd.equals("nome"))
System.out.println("getName " + cont.getName());
else if(cmd.equals("movimenti"))
{
Vector<String> v = cont.getAccesses();
synchronized (v)
{
for(Enumeration<String> e = v.elements(); e.hasMoreElements();)
System.out.println(e.nextElement());
}
}
else
System.out.println(ERRORMSG);
}
}
catch(RemoteException e)
{
logger.severe("Problemi con oggetti remoti: " + e.getMessage());
e.printStackTrace();
}
catch(Exception e)
{
logger.severe("C'è qualche altro problema: " + e.getMessage());
e.printStackTrace();
}
System.out.println("Ciao");
System.exit(0);
}
private static String ask() throws IOException
{
System.out.println(">> ");
return(con.readLine());
}
}
Lato Client:
Interfaccia Counter
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Counter extends Remote
{
int getValue(String from) throws RemoteException;
void sum(String from, int v) throws RemoteException;
}
Classe CounterClient
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.logging.Logger;
public class CounterClient
{
static Logger logger = Logger.getLogger("global");
public static void main(String args[])
{
String host = "localhost";
if(System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
String nome = args[1];
if(args.length == 3)
host = args[2];
try
{
Counter cont = (Counter) Naming.lookup("rmi://"+host+"/Contatore");
int valore = Integer.parseInt(args[0]);
cont.sum(nome, valore);
}
catch(RemoteException e)
{
logger.severe("Problemi con oggetti remoti: " + e.getMessage());
e.printStackTrace();
}
catch(Exception e)
{
logger.severe("C'è qualche altro problema: " + e.getMessage());
e.printStackTrace();
}
}
}
Alcune premesse. Il codice è un esempio preso dal libro del corso. Ho impostato la politica di sicurezza creando il file policyall con il seguente contenuto
grant
{
permission java.security.AllPermission;
};
e ho passato come argomenti alla macchina virtuale il seguente comando
-Djava.security.policy=policyall
Infine ho eseguito rmiregistry (che parte senza problemi) ma quando vado ad eseguire il server ecco a voi il risultato
dic 01, 2014 4:03:13 PM CounterServer main
GRAVE: Problemi con oggetti remoti: Stub class not found: RemoteCounter_Stub; nested exception is:
java.lang.ClassNotFoundException: RemoteCounter_Stub
java.rmi.StubNotFoundException: Stub class not found: RemoteCounter_Stub; nested exception is:
java.lang.ClassNotFoundException: RemoteCounter_Stub
at sun.rmi.server.Util.createStub(Util.java:292)
at sun.rmi.server.Util.createProxy(Util.java:140)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:196)
at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310)
at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:237)
at RemoteCounter.<init>(RemoteCounter.java:17)
at CounterServer.main(CounterServer.java:24)
Caused by: java.lang.ClassNotFoundException: RemoteCounter_Stub
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at sun.rmi.server.Util.createStub(Util.java:286)
... 6 more
Ciao
Ecco credo di avervi dato tutti gli strumenti per potermi aiutare e discutere di questo errore. Grazie in anticipo