Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Java RMI

  1. #1

    Java RMI

    Salve a tutti, io devo fare un programma che realizzi un gioco di scommesse, con il server che deve provvedere a terminare i client che non hanno più soldi a disposizione. Io ho creato nel client una funzione esci() con dentro System.exit(1), ma quando vado a chiamarla dal server mi dà errore(come se ci fosse ancora una sorta di comunicazione): come posso interrompere la connessione col client? Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Aleandro23 Visualizza il messaggio
    Io ho creato nel client una funzione esci() con dentro System.exit(1), ma quando vado a chiamarla dal server mi dà errore(come se ci fosse ancora una sorta di comunicazione): come posso interrompere la connessione col client?
    Premessa: RMI non è una cosa che si usa tutti i giorni, anche per me, quindi vado un po' a "ricordi".
    Detto questo, la tua questione è un po' "vaga", nel senso che bisognerebbe vedere meglio cosa hai scritto come codice.

    Comunque c'è una questione da avere ben chiaro: in RMI il server crea oggetti "remoti" che rende disponibili verso i client. Un client ottiene un oggetto remoto (per essere più precisi, riceve un oggetto che fa da "proxy" verso l'oggetto remoto), ed è il client che INVOCA metodi verso l'oggetto remoto implementato sul server. Detto in altro modo: NON è il server che invoca qualcosa verso il client!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premessa: RMI non è una cosa che si usa tutti i giorni, anche per me, quindi vado un po' a "ricordi".
    Detto questo, la tua questione è un po' "vaga", nel senso che bisognerebbe vedere meglio cosa hai scritto come codice.

    Comunque c'è una questione da avere ben chiaro: in RMI il server crea oggetti "remoti" che rende disponibili verso i client. Un client ottiene un oggetto remoto (per essere più precisi, riceve un oggetto che fa da "proxy" verso l'oggetto remoto), ed è il client che INVOCA metodi verso l'oggetto remoto implementato sul server. Detto in altro modo: NON è il server che invoca qualcosa verso il client!
    Utilizzo un altro esempio che deve fare pressoché la stessa cosa. Il gioco si chiama PingPong, che è un gioco a punti che inizia quando il server digita !stop inizia la partita. Da quel momento, ogni volta che il server scrive una parola che contiene ping, il primo che risponde con una parola che contiene pong vince un 1 punto. Il primo che arriva a 3 vince. Dopo aver proclamato il vincitore, il server deve provvedere a far terminare i client.

    Classe Messaggio:
    codice:
    package esame11062010;
    
    import java.io.Serializable;
    
    
    public class Messaggio implements Serializable {
    
    
        public Messaggio(String mittente, String testo) {
            this.mittente = mittente;
            this.testo = testo;
        }
        
        public String getMittente() {
            return mittente;
        }
    
    
        public void setMittente(String mittente) {
            this.mittente = mittente;
        }
    
    
        public String getTesto() {
            return testo;
        }
    
    
        public void setTesto(String testo) {
            this.testo = testo;
        }
    
    
        private String mittente, testo;
    
    
    }
    Classe Registro:
    codice:
    package esame11062010;
    
    public class Registro {
    
    
        public Registro(Callback call) {
            this.call = call;
            this.punteggio = 0;
        }
        
        public Callback getCall() {
            return call;
        }
        public void setCall(Callback call) {
            this.call = call;
        }
        public int getPunteggio() {
            return punteggio;
        }
        public void incrementaPunteggio() {
            punteggio++;
        }
        public void decrementaPunteggio() {
            punteggio--;
        }
    
    
        private Callback call;
        private int punteggio;
    
    
    }
    Interfaccia Client:
    codice:
    package esame11062010;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    
    public interface Callback extends Remote {
        
        public void iscritto(String nick) throws RemoteException;
        
        public void abbandonato(String nick) throws RemoteException;
        
        public void detto(String s) throws RemoteException;
        
        public void esci() throws RemoteException;
    
    
    }
    Interfaccia Server:
    codice:
    package esame11062010;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    
    public interface ServerRemote extends Remote {
        
        public void iscrivi(String nick, Callback id) throws RemoteException;
        
        public void abbandona(String nick) throws RemoteException;
        
        public void dici(Messaggio msg) throws RemoteException;
    
    
    }
    Codice Client:
    codice:
    package esame11062010;
    
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    
    public class Client extends UnicastRemoteObject implements Callback {
    
    
        public Client() throws RemoteException {
            super();
        }
    
    
        public static void main(String[] args) {
            System.setSecurityManager(new SecurityManager());
            Callback io = null;
            ServerRemote se = null;
            String nick = "Arcibaldicchio3";
            try {
                io = new Client();
                se = (ServerRemote) Naming.lookup("//localhost/PingPong");
                se.iscrivi(nick, io);
                String ordini = "";
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                for(;;) {
                    ordini = in.readLine();
                    if(ordini.equals("!abbandona")) {
                        se.abbandona(nick);
                        System.exit(1);
                    } else {
                        se.dici(new Messaggio(nick,ordini));
                        
                    }
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
    
        @Override
        public void iscritto(String nick) throws RemoteException {
            System.out.println(nick + " si è iscritto");
        }
    
    
        @Override
        public void abbandonato(String nick) throws RemoteException {
            System.out.println(nick + " ha abbandonato");
        }
    
    
        @Override
        public void detto(String s) throws RemoteException {
            System.out.println(s);
        }
        
        @Override
        public void esci() throws RemoteException {
            System.exit(1);
        }
    
    
    }
    Codice Server:
    codice:
    package esame11062010;
    
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.HashMap;
    import java.util.Map.Entry;
    import java.util.logging.Logger;
    
    
    public class Server extends UnicastRemoteObject implements ServerRemote {
        
        static Logger logger = Logger.getLogger("Global");
        
        static HashMap<String, Registro> lista = new HashMap<String, Registro>();
        static boolean iscrizioni = true;
        static boolean ping = false;
    
    
        public Server() throws RemoteException {
            super();
        }
    
    
        public static void main(String[] args) {
            System.setSecurityManager(new SecurityManager());
            ServerRemote se = null;
            try {
                se = new Server();
                Naming.rebind("PingPong", se);
                logger.info("Server pronto");
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                String ordini = "";
                for(;;) {
                    ordini = in.readLine();
                    if(ordini.equals("!stop")) {
                        iscrizioni = false;
                        se.dici(new Messaggio("Server","Il gioco ha inizio"));
                    } else if(!iscrizioni && ordini.contains("ping")) {
                        ping = true;
                        se.dici(new Messaggio("Server",ordini));
                    } else {
                        se.dici(new Messaggio("Server",ordini));
                    }
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
    
        @Override
        public synchronized void iscrivi(String nick, Callback id) throws RemoteException {
            if(!iscrizioni) {
                id.detto("Mi spiace, troppo tardi");
                id.esci();
                return;
            }
            for(Registro r : lista.values()) {
                Callback ca = r.getCall();
                ca.iscritto(nick);
            }
            lista.put(nick, new Registro(id));
            id.detto("Benvenuto " + nick);
        }
    
    
        @Override
        public synchronized void abbandona(String nick) throws RemoteException {
            lista.remove(nick);
            for(Registro r : lista.values()) {
                Callback ca = r.getCall();
                ca.abbandonato(nick);
            }
        }
    
    
        @Override
        public synchronized void dici(Messaggio msg) throws RemoteException {
            String s = msg.getMittente() + ": " + msg.getTesto();
            Registro reg = lista.get(msg.getMittente());
            System.out.println(msg.getMittente() + ": " + msg.getTesto());
            for(Entry<String, Registro> entry : lista.entrySet()) {
                Registro r = entry.getValue();
                Callback ca = r.getCall();
                ca.detto(s);
            }
            if(!iscrizioni) {
                if(msg.getTesto().contains("pong")) {
                    if(ping) {
                        reg.incrementaPunteggio();
                        ping = false;
                        if(reg.getPunteggio() == 3) {
                            for(Entry<String, Registro> entry : lista.entrySet()) {
                                Callback ca = entry.getValue().getCall();
                                ca.detto("Il vincitore è " + msg.getMittente());
                            }
                            chiudiPartita(msg.getMittente());
                        }
                    } else {
                        reg.decrementaPunteggio();
                    }
                    reg.getCall().detto("Il tuo punteggio è " + reg.getPunteggio());
                }
            }
        }
        
        public synchronized void chiudiPartita(String nick) throws RemoteException {
            for(Entry<String, Registro> entry : lista.entrySet()) {
                Callback ca = entry.getValue().getCall();
                ca.esci();
            }
            iscrizioni = true;
            lista = new HashMap<String, Registro>();
        }
    
    
    }
    Nella funzione chiudi partita, provvedo a eliminare tutti i riferimenti dei Client dopo aver invocato la funzione esci() (che non va). Sicuramente c'è un grave errore logico da parte mia, ma non so quale.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.