Problema esecuzione programma java RMI

di il
2 risposte

Problema esecuzione programma java RMI

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

2 Risposte

  • Re: Problema esecuzione programma java RMI

    Hai generato lo stub usando il comando rmic? Sembrerebbe che non venga trovato.
    Se non l'hai generato, allora generalo!
    Se l'hai generato, controlla che sia nella directory giusta.

    Ricordati infine che devi far partire rmiregistry per poter registrare il server....
  • Re: Problema esecuzione programma java RMI

    In verità ho eseguito altri programmi senza utilizzare rmic...perché ho scoperto anche grazie al mio prof che con le nuove versioni di java lo stub viene generato in automatico...comunque provo a eseguirlo e vi faccio sapere
Devi accedere o registrarti per scrivere nel forum
2 risposte