Avatar billede supermichael Nybegynder
01. februar 2007 - 02:45 Der er 4 kommentarer og
1 løsning

RMI artikel af arne_v

Hej arne..
I din artikkel RMI avanceret, har du lavet et eksempel der virker ved en client, common, server model.
Jeg er i den situation at jeg gerne vil lave et spil, hvor man kan vælge host game og join game. Altså hvor man som host også selv er en spiller i spillet.

Jeg har lavet tre static funktioner der henholdsvis starter, stopper lytning, og stopper hele serveren. Når jeg så fra mit program (som jeg lægger i common) gerne vil bede serveren om at starte, kan skal jeg til at lege med RemoteExceptions. Det kan ikke være den rigtige måde vel.

Hvordan kan jeg lave mit program så client og server er forbundet, og f.eks. en main i common (eller andet) kan vælge om programmet skal serve eller kalde op til en server?
Avatar billede supermichael Nybegynder
01. februar 2007 - 16:10 #1
Hehe ups.  Grunden til at jeg skulle lege med RemoteExceptions var, at jeg havde lavet noget rod i en anden fil..
Nu har jeg så rettet det, og nu brokker den sig ikke længere.. Jeg har nu lavet funktionerne:

public static Dealer serverCreate () {
        Dealer dealer = null;
        try {
            dealer = new Dealer();
            if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager());
            if (RMISocketFactory.getSocketFactory() == null) RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
           
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
       
        return dealer;
    }
   
    public static Registry serverListening (boolean setOn, int port, Dealer dealer) {
        Registry registry = null;
        try {
            if (setOn) {
                // denne laver måske et helt nyt pokerspil
                registry = LocateRegistry.createRegistry(port);
                Naming.rebind("rmi://localhost:" + port + "/PokerServer", dealer);
            } else {
                Naming.unbind("rmi://localhost:" + port + "/PokerServer");
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return registry;
    }

    public static void serverStop(Registry registry) {
        try {
            UnicastRemoteObject.unexportObject(registry, true);
        } catch (NoSuchObjectException e) {
            e.printStackTrace();
        }
    }

Her er det min dealer der extender remote.
Jeg kan bare ikke rigtigt lukke for forbindelsen når jeg først har startet den.

Jeg har i min GUI (i common) lavet en knap "Host Game" som kalder serverCreate(), og gemmer dealeren (remote) i en variabel.
Den bliver så brugt når serverListening() bliver kaldt, som laver registry og binder objektet. her returneres registry som skal bruges når registry skal lukkes igen.

Når jeg gerne vil afslutte serveren bruger jegserverStro() som bruger UnicastRemoteObject.unexportObject(registry, true)

Men serveren stopper igge.. Hvad er der galt?
Avatar billede supermichael Nybegynder
01. februar 2007 - 16:20 #2
Undskyld mine mange stavefejl.. er lige vågnet :-)
Avatar billede supermichael Nybegynder
01. februar 2007 - 19:35 #3
Hov.. Jeg tror jeg ved hvad der skal gøres.. Men ret mig hvis jeg tager fejl..

Jeg skal skrive en ekstra
UnicastRemoteObject.unexportObject(dealer, true);

For at lukke serveren helt..
Har jeg ret?
Avatar billede arne_v Ekspert
03. februar 2007 - 04:27 #4
jeg må indrømme at jeg har aldrig rigtigt haft problem stillingen

prøv da dit sidste forslag og se om det hjælper
Avatar billede supermichael Nybegynder
12. februar 2007 - 00:42 #5
Det virker som om det var det der skulle til.. Har ikke oplevet fejl med det endnu..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester