Domanda Java RMI e grafica

di il
3 risposte

Domanda Java RMI e grafica

Buongiorno,

Sono alle prime armi con java e dopo aver fatto qualche piccolo programmino RMI volevo alzare un po il livello cercando di fare qualcosa con la grafica e rmi.
Ho scritto una classe Grafica che contiene un JFrame con un JButton e una JLabel. Ho scritto una classe Server, una ServerInterface e una classe Client in cui ho impostato i registri etc.
Vorrei che quando parte il server parta il Frame e che, a seconda del client che schiaccia il bottone, la Label assuma un testo differente. Non riesco a fare nulla che funzioni però... E' una cosa possibile? Come posso fare?

Grazie mille in anticipo

3 Risposte

  • Re: Domanda Java RMI e grafica

    marco1993 ha scritto:


    Vorrei che quando parte il server parta il Frame e che, a seconda del client che schiaccia il bottone, la Label assuma un testo differente. Non riesco a fare nulla che funzioni però... E' una cosa possibile? Come posso fare?
    Sicuramente è possibile. Premetto che non uso normalmente RMI (è una cosa MOLTO particolare), quindi sono un po' arruginito su RMI.
    Posta eventualmente del codice, così magari si capisce anche meglio cosa vuoi fare.
  • Re: Domanda Java RMI e grafica

    andbin ha scritto:


    Posta eventualmente del codice, così magari si capisce anche meglio cosa vuoi fare.
    Questa è l'ultima prova che ho fatto... Ho messo direttamente nel server il frame e il bottone per cambiare testo alla label, e ho creato una classe application da cui faccio partire due client con nomi differenti... ma non funziona... cioè parte ma non fa quello che dovrebbe... incollo qua tutte le classi che ho fatto... grazie mille
    public class Server implements ServerInterface{
    	private JFrame frame;
    	private JButton btnCambia;
    	private JLabel lblNome;
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					Server window = new Server();
    					window.frame.setVisible(true);
    					Server server = new Server();
    					ServerInterface stub = (ServerInterface) UnicastRemoteObject.exportObject((Remote) server,0);
    					Registry registro = LocateRegistry.getRegistry();
    					registro.bind("server", stub);
    
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    	public Server() {
    		initialize();
    	}
    	private void initialize() {
    		frame = new JFrame();
    		frame.setBounds(100, 100, 450, 300);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(null);
    		lblNome = new JLabel("Nome");
    		lblNome.setBounds(198, 76, 61, 16);
    		frame.getContentPane().add(lblNome);
    		btnCambia = new JButton("Cambia");
    		btnCambia.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				try {
    					cambia();
    				} catch (RemoteException e1) {
    					e1.printStackTrace();
    				}
    			}
    		});
    		btnCambia.setBounds(165, 178, 117, 29);
    		frame.getContentPane().add(btnCambia);
    	}
    	public void cambia() throws RemoteException {
    		lblNome.setText(Client.nome);
    	}
    }
    
    public interface ServerInterface extends Remote {
    	void cambia() throws RemoteException;
    }
    
    public class Client{
    	public static String nome;
    	public static void main(String args[]) {
    		try{
    			Registry registro = LocateRegistry.getRegistry();
    			ServerInterface i = (ServerInterface) registro.lookup("server");
    		}
    		catch (Exception e){	
    		}	
    	}
    	public Client(String n){
    		nome = n;
    	}
    }
    
    public class Application {
    	public static void main(String[] args) {
    		Client C1 = new Client("Paolo");
    		Client C2 = new Client("Giovanni");
    	}
    }
    
  • Re: Domanda Java RMI e grafica

    marco1993 ha scritto:


    Questa è l'ultima prova che ho fatto... Ho messo direttamente nel server il frame e il bottone per cambiare testo alla label, e ho creato una classe application da cui faccio partire due client con nomi differenti... ma non funziona...
    Ok, ho visto il codice. Ma ... è parecchio confuso/inadatto! Innanzitutto il concetto è che il server espone una serie di metodi tramite la remote interface. In sostanza è il client che invoca "qualcosa" sul server ... NON il contrario.

    Quindi non ha granché senso che nel actionPerformed invochi tu cambia() cercando di usare "qualcosa" dal client. Anche perché potresti avere più client! Quindi Client.nome CHE COSA?? Non ha senso. "Client" e "server" sono comunque due istanze di JVM differenti (possono essere sulla stessa macchina fisica o due macchine distinte). Quindi la classe Client caricata sul Server non c'entra nulla con quella che il client carica. Anche se tu il file Client.class lo metti a disposizione di entrambe le parti, la JVM "server" caricherà la classe Client ma il campo statico nome vale null e non c'entra niente con il Client caricato dalla JVM "client".

    Se vuoi che un client possa cambiare una label sul frame che gestisce il server, allora metti un parametro al cambia() (es. cambia(String nome) ) e così quando un client ottiene il ServerInterface dal lookup, può invocare il cambia passando qualcosa.

    Se invece intendi qualcos'altro, chiarisci meglio, perché quel tuo codice è dubbio/confuso.
Devi accedere o registrarti per scrivere nel forum
3 risposte