Nada

Laboration 5 CORBA

Med CORBA (Common Object Request Broker Architecture) kan program anropa varandra även om dom körs på olika datorer och är skrivna i olika språk. För det anropande klientobjektet ser det ut som ett vanligt metodanrop till ett vanligt objekt men i själva verket anropas en liten stubbe som översätter anropet till ett metaspråk och skickar vidare till en ORB (Object Request Broker). En ORB kan kommunicera med en ORB på en annan dator via protokollet IIOP (Internet Inter-ORB Protocol). Denna ORB letar upp rätt serverobjekt och låter en stubbe göra anropet i rätt språk. Sedan ska returvärdet gå samma väg tillbaka. Om klient och server finns på samma dator räcker det förstås med en ORB. Stubben på serversidan kallas också skelett (meddelas endast för att det står så i bilden).

diagram-orb_to_orb.gif

Ett program som ska anropa objekt via CORBA måste få veta vilka metoder som finns tillgängliga. Detta beskrivs med språket IDL (Interface Definition Language). IDL-kompilatorer som skapar stubbar från en IDL-fil finns för dom flesta programmeringsspråk. För att kompilera psyk.idl till Java används kommandot

      idlj -fall psyk.idl
    
Resultatet av kompileringen är ett paket psyk av flera Java-filer.

Labuppgift

Börja med att hämta filen psyk.idl och kompilera den. I filen finns tre interface definierade. PsykServer beskriver ett serverobjekt som på begäran skickar meddelanden till alla anslutna klientobjekt och till den simulerade psykologen Eliza, som svarar professionellt på allt som sägs. Tre viktiga metoder i PsykServer är:

Metoden connect returnerar ett booleskt värde som är true om anslutingen lyckades. Det går inte att ansluta mer än en klient med samma namn, så om connect returnerar false kan det bero på att namnet är upptaget. Försök då med ett annat namn.

Serverorben går på elektrodatorn shell och på den har ett PsykServerobjekt registrerats under namnet Psyk. Följande Java-kod i din main ger en referens till serverobjektet.

      ORB orb = ORB.init(args, null);
      POA rootpoa =
          POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
      rootpoa.the_POAManager().activate();
      org.omg.CORBA.Object ns = orb.resolve_initial_references("NameService");
      NamingContext ncx = NamingContextHelper.narrow(ns);
      NameComponent nc = new NameComponent("Psyk", "");
      NameComponent[] path = {nc};
      PsykServer server = PsykServerHelper.narrow(ncx.resolve(path));
    

Första satsen gör uppkopplingen till serverorben, de två följande skapar en Portable Object Adaptor som ligger mellan orb och anropat objekt, resten gäller orbens namnförteckning. Dator och portnummer anges i args, antingen i startkommandot:

      java Psykning -ORBInitialHost shell.e.kth.se -ORBInitialPort 4711
    
eller förvalt i programmet. Eftersom fel i kommunikationen kan uppstå när som helst måste alla satser i main omges av try{ - - } catch(Exception e){ - - }. Några importer behövs:
      import org.omg.CORBA.*;
      import org.omg.CosNaming.*;
      import org.omg.PortableServer.*;
      import psyk.*;
    
Så ska du ha ett klientobjekt också som kan anropas av serverprogrammet. Den måste implementera dom två metoderna i gränssnittet PsykClient. I övrigt får klienten se ut hur som helst. Man kan till exempel ha en setName-metod också.

Konstigt nog ska inte klientklassen ange implements PsykClient. För att den portabla objektadaptern ska acceptera CORBA-stubben måste det stå så här.

      class Klient extends PsykClientPOA 
    
Eftersom klientobjektet nu inte är av typen PsykClient och därför inte genast kan användas som parameter till serverns connect-metod, finns en metod _this(orb) som ger tillbaka en PsykClient.
      server.connect(klient._this(orb));
    
Parametern orb behövs bara första gången.

I sin enklaste version ska psykningsprogrammet skapa ett serverobjekt och ett klientobjekt enligt ovan och sedan i en slinga läsa en rad från tangenterna och säga den till servern, varpå servern anropar klienten som skriver ut svaret. Se till att slingan avbryts snyggt vid tom returtryckning så att servern kan disconnectas.

När kommunikationen fungerar bra vill du ha konversationen i ett fönster. Bäst är att ändra så lite som möjligt i fungerande kod och i stället göra en klass View som sköter allt grafiskt. Låt till exempel viewobjektet ha en metod som lägger till text sist i fönstret och låt klientobjektet göra view.showMsg(msg) samtidigt som den skriver ut det i terminalfönstret. Hur referensen view ska föras över till klienten får du hitta på själv.

Inmatningen kan också ske i view i lämplig komponent som den lyssnar på och en quit-knapp är alltid rätt. För att lyssnaren ska kunna göra rätt saker måste referenserna server och klient föras över till view på något sätt.

Extrauppgift: En närmare granskning av IDL-filen avslöjar ytterligare tre metoder i PsykServer, nämligen:

De två sista metoderna ansluter respektive kopplar bort objekt av klassen PsykMonitor, som även den definieras i filen psyk.idl. Sådana objekt har två metoder: Extrauppgiften är alltså att använda dessa metoder för att förbättra klienten på valfritt sätt. Tydligen bör monitorn samla alla namn i en lista. Tillämpa model-view-control genom att ha en DefaultListModel namnlista i monitorn och koppla den till en new JList(monitor.namnlista) i view-objektet. Då uppdateras listan automatiskt, eftersom den lyssnar på modellen. Men låt också addClient och removeClient skriva ut listan i terminalfönstret; det brukar förenkla avlusningen.



Objektivt kodat av ................................... kommenterar .............................. den ..............