Lihtne CORBA rakendus – tehke seda ise. CORBA (Common Object Request Broker Architecture) tehnoloogia

Tutvuge käesoleva juhendi ja näidisprogrammide lisades toodud teoreetilise materjaliga. Lugege ülesande teksti laboritööd, pakkuge välja komponentide paigutus ja funktsionaalsus, mis vastavad laboriülesannete nõuetele, ning kirjutage programm.

2. Laboriülesanne

Arendada meili klient ja server. Klient - akna rakendus, mis võimaldab teil serverist sõnumeid saata ja vastu võtta. Klientide tuvastamine serveris, sõnumiedastusprotokoll on õpilaste äranägemisel.

Server võib olla konsoolirakendus. Saate sõnumeid salvestada tekstifaili. Soovitatav on muuta server mitmelõimeliseks.

Kliendi ja serveri vaheliseks suhtlemiseks kasutage CORBA tehnoloogiat.

Lisaks tehakse ettepanek juurutada server või klient mitte Javas.

3. Aruande sisu

Aruanne peab sisaldama:

1. Hästi toimiva programmiga lahendatud probleemi avaldus.

2. Silutud programmi kasutusjuhend, mis sisaldab kõigi programmi funktsioonide liideste kirjeldust.

3. Programmi loetelu koos vajalike kommentaaridega.

4. Kontrollküsimused

1. Mis on CORBA?

2. Mis on IDL? Milleks see mõeldud on?

3. Kuidas klient ja server CORBA-s suhtlevad?

4. Kuidas toimub andmete ülekandmine nende vahel?

5. Milleks on nimeserver?

6. Kuidas käivitate CORBA serveri?

5. Kirjandus

1. Ken Arnold, James Gosling, David Holmes. Java™ programmeerimiskeel.

2. Ametlik Java veebisait – http://java.sun.com/ (seal on venekeelne sektsioon koos õpikuga).

3. Java™ 2 SDK, Standardväljaanne Dokumentatsioon – http://java.sun.com/products/jdk/1.5/index.html.

4. James Gosling, Bill Joy, Guy Steele. Spetsifikatsioon Java keel(Java keele spetsifikatsioon – http://www.javasoft.com/docs/books/jls/). Tõlge vene keelde – http://www.uni-vologda.ac.ru/java/jls/index.html

5. Eclipse'i projekti ametlik veebisait on http://www.eclipse.org/.

6. Lisa 1. CORBA

CORBA tehnoloogia(Common Object Request Broker Architecture) on kirjutamisstandard hajutatud rakendused, mille on välja pakkunud OMG (Open Management Group) konsortsium. CORBA objekte luues saame näiteks oluliselt vähendada aega, mis kulub palju arvutusi nõudvate probleemide lahendamiseks. See on võimalik CORBA objektide paigutamisega erinevad autod. Iga kaugobjekt lahendab konkreetse alamülesande, vabastades seeläbi kliendi tarbetust tööst.

CORBA tuum on objektipäringu vahendaja. ORB haldab objektide interaktsiooni hajutatud võrgukeskkonnas. IIOP (Internet Inter-ORB Protocol) on spetsiaalne protokoll ORB-de interaktsiooniks.

Kliendi aadressiruumis töötab spetsiaalne objekt nimega stub. Saanud kliendilt päringu, pakib see päringu parameetrid spetsiaalsesse vormingusse ja edastab selle serverisse või õigemini skeletti.

Skelett on objekt, mis töötab serveri aadressiruumis. Saanud kliendilt päringu, pakib ta selle lahti ja saadab serverisse. Skelett teisendab ka serveri vastused ja edastab need kliendile (stub).

Mis tahes CORBA rakenduse kirjutamiseks Java tehnoloogia, teil peab olema kaks asja – see installitud pakett JDK1.5 ja idlj kompilaator (...\jdk1.5.0\bin\idlj.exe). JDK pakub CORBA objektidega töötamiseks klasside komplekti ja idlj kaardistab IDL keele Javaga.

6.1 Lihtsa CORBA rakenduse loomine

6.1.1 Liidese kirjutamine

Javas CORBA rakenduse loomine algab liidese kirjutamisega kaugobjektile, kasutades liidese määratluskeelt (IDL).

Loome faili hello.idl

Moodul HelloApp(liides Hello(string sayHello();oneway void shutdown();););

See liides kirjeldab ainult kahte meetodit, sulgemist ja ütle Tere. Pealegi pole meie jaoks oluline, mida need meetodid teevad, peamine on see, et me teeme kindlaks nende olemasolu ja määrame kindlaks, millised sisend- ja väljundparameetrid neil on.

idlj – sügis Tere.idl

Ilmus praeguses kataloogis uus kaust Tere Rakendus, mis sisaldab kuut Java-faili. Igal neist on oma eesmärk.

· HelloPOA.java java on abstraktne klass, mis pole midagi muud kui serveri skelett (skelett) ja pakub serveri funktsionaalsust.

· _HelloStub.java – klass, mis realiseerib kliendi stub. Pakub kliendi funktsioone.

HelloHelper.java ja HelloHolder.java on klassid, mis pakuvad sekundaarsed funktsioonid CORBA objektide jaoks.

· HelloOperations.java – klass, mis sisaldab Java-keelse hello liidese kirjeldust.

· Hello.java – klass, mis on HelloOperationsi järglane, mis toetab liidest org.omg.CORBA. Objekt.

6.1.2 Serveri loomine

Nüüd on meie ülesandeks kirjutada klass, mis rakendab liidest Tere. Meie puhul saab see olema TereImpl. Pange tähele, et see on selle klassi järeltulija TerePOA. IN TereImpl aastal deklareeritud meetodid Tere . idl .

Ülesande lihtsustamiseks võib failist võtta meetodite deklaratsiooni TereOperatsioonid . java , loodud jdlj .

Klass HelloImpl laiendab HelloPOA-d (privaatne ORB orb; public void setORB (ORB orb_val) (orb = orb_val;) // rakenda sayHello() methodpublic String sayHello() (tagasi "\nTere maailm!!\n";) // rakenda shutdown() methodpublic void shutdown() (orb .shutdown(false);))

Järgmine samm on luua rakenduse tegelik serveripool. Sellest saab HelloServeri klass.

Sellel on ainult üks meetod - standardne põhifunktsioon.

Esimese asjana loome ORB-i. Seejärel loome kaugobjektiklassi eksemplari (HelloImpl) ja registreerime selle ORB-is. Järgmisena helistame eriteenus nimed (NameService) ja registreerige selles kaugobjekti nimi, et klient selle leiaks.

Vaatame neid etappe lähemalt.

1. ORB loomine ja initsialiseerimine. Toodetud helistades staatiline meetod selles ORB klass

2. Kaugobjektiklassi eksemplari loomine ja selle registreerimine ORB-is

tereImpl.setORB(orb);

3. Nimeandmiskonteksti hankimine (NamingContext)

org.omg.CORBA. Object objRef = orb.resolve_initial_references("Nimiteenus");

Esimesel real saame objektiviide nimeteenusele (NameService). Kuid tegelikult on see tavaline CORBA objekt ja selleks, et seda nimetamiskontekstina kasutada (NamingContext), peate kutsuma meetodi kitsas klass NamingContextHelper, mis näib täpsustavat seda CORBA objekti.

4. Kaugobjekti nime registreerimine (HelloImpl)

Stringi nimi = "Tere";

ncRef.rebind(tee, href);

Nimi registreeritakse, et klient saaks kaugobjekti leida. Seda eesmärki täidab NamingContext liidese rebind (NameComponent nc, Object obj) funktsioon.

5. Kliendi päringute ootamine

Server on nüüd kasutamiseks valmis.

// HelloServer.javaimport HelloApp.*;import org.omg. CosNaming.*;import org.omg. CosNaming. NamingContextPackage.*;import org.omg.CORBA.*;import org.omg. PortableServer.*;import org.omg. PortableServer.POA;import java.util. Atribuudid;klass HelloImpl laiendab HelloPOA (privaatne ORB orb;public void setORB (ORB orb_val) (orb = orb_val;) // rakendame sayHello() meetoditpublic String sayHello() (tagasi "\nTere maailm!!\n";) // rakenda shutdown() meetodpublic void shutdown() (orb.shutdown(false);))

avalik klass HelloServer(

avalik static void main (String args) (

// looge ja lähtestage ORB

ORB orb = ORB.init(args, null);

// hankige viide rootpoale ja aktiveerige POAManager

POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

rootpoa.the_POAManger().activate();

// loo teenindaja ja registreeri see ORB-s

HelloImpl tereImpl = new HelloImpl();

tereImpl.setORB(orb);

// saada teenindajalt objektiviide

org.omg.CORBA. Objekti ref = rootpoa.servant_to_reference(tereImpl);

Tere href = HelloHelper.narrow(ref);

// hankige juurnimede kontekst

// NameService kutsub välja nimeteenuse

org.omg.CORBA. Objekt objRef =

orb.resolve_initial_references("Nimiteenus");

// Kasutage NamingContextExti, mis on koostalitlusvõime osa

// Nimeteenuse (INS) spetsifikatsioon.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// seotakse nimede andmises objektiviide

Stringi nimi = "Tere";

NimiComponent tee = ncRef.to_name(nimi);

ncRef.rebind(tee, href);

System.out.println("TereServer valmis ja ootab...");

// ootama klientide kutseid

püüda (erand e) (

System.err.println("VIGA:" + e);

e.printStackTrace(System.out);

System.out.println("TereServer väljub...");

6.1.3 Kliendi loomine

Liigume edasi kliendi jaoks koodi kirjutamise juurde.

Kirjutamise põhietapid kliendirakendus

1. ORB loomine ja lähtestamine

2. Nimemisteenuse konteksti hankimine (NamingContext)

3. Kaugobjekti leidmine

4. SayHello meetodi kutsumine.

5. Väljalülitusmeetodi kutsumine.

Nagu näete, langevad kaks esimest punkti kokku serverirakenduse loomise etappidega, seega me neid ei arvesta.

Kolmas punkt on samuti üsna lihtne rakendada. Objekt NameComponent luuakse. Kutsutakse välja lahendus (NameComponent path) meetod, mis leiab kaugobjekti (standardse CORBA objekti) nime järgi. Kasutades helloHelperi klassi kitsast meetodit (org.omg.CORBA. Object obj) (genereeritud idlj-kompilaatoriga), saame objektiviite hello liidesele.

Stringi nimi = "Tere";

helloImpl = TereHelper.narrow(ncRef.resolve_str(nimi));

Ma tean, et CORBA võimaldab teil rakendada mitut objekti erinevaid keeli programmeerida ja isegi töötada erinevates andmetöötlussõlmedes. Kuid kas siis on vaja kahte erinevat ORB-d kirjutada kahes erinevas keeles?

Näide: Sõlm A käivitub Java rakendus J1 ja sõlm B käitavad rakendust C++ C1. Kas ma peaksin hankima "Java ORB" sõlme A jaoks ja "C++ ORB" sõlme B jaoks või kas kõik/mõned ORB-d töötavad koos rakendustega, mis on kirjutatud mis tahes keeles, millel on IDL vastendus?

Oleksin eriti tänulik, kui keegi viidaks mind mõne allikaga, märkides selle otse välja nii, nagu ma sooviksin. Lähim, mida ma olen leidnud, on "viis, kuidas programmeerija manipuleerib struktuuri või ühendusega, teeb puhverserveri abil kaugkõne või rakendab liidest teenindajaklassiga, samamoodi kõigis CORBA C++ toodetes, samamoodi kõigis Javas CORBA tooted jne." d. ". See paneb mind mõtlema, et mul on vaja kahte ORB-d, kuid mitte piisavalt selgesõnaliselt. Põhimõtteliselt tahaks teada, kas võin öelda, et "kuna ORB on kirjutatud C++ keeles, siis on ka rakenduste programmeerijatel keelatud C++ kasutamine".

tänu

3 vastust

Pole tähtis, millises keeles ORB-i rakendatakse, oluline on see, milliseid keelelisi köiteid see pakub. L-keele jaoks on vaja orbi, mis pakub sidemeid L-keele jaoks.

Ei. CORBA mõte seisneb selles, et see lahutab komponendid täielikult.

Ilmselt peavad teie rakendused kasutama klienditeeke, millega nad saavad suhelda. Teie ORB saab installida köiteid ainult ühe keele jaoks, sel juhul peate leidma teised sidemed või leidma viisi nendega suhtlemiseks (näiteks kui kasutate Pythonit, saate siiski soovi korral töötada C++ teekidega ).

Proovige seda tehnoloogiat kasutada.

CORBA rakenduste juurutamisel saab kasutada mitut lähenemisviisi, kuid kokkuvõtteks võib öelda, et jah, ORB raamistik peab olema samas keeles kui teie rakenduse juurutamine.

Nii Java kui ka C++ puhul loob IDL-i kompilaator tünnid ja skeletid, mis toimivad võrgu ja teie programmi vahelise liimina. Esitate oma CORBA objektide teostuse, mis pärineb tavaliselt kompilaatori loodud IDL-klassist (skelett). Skelett saab mingil moel kliendilt päringu vastu ja kutsub seejärel teie juurutuse välja. Sama asi juhtub vastupidiselt kliendi poolel.

Nii skelett kui ka tünn kasutavad seejärel ORB-i pakutavaid mehhanisme serveritele eemalt helistamiseks ja vastustamiseks, sealhulgas võrguühenduste loomiseks, kui klient ja serverid asuvad erinevates masinates. Seda "maagiat" rakendab ORB ja see peab teie programmis olema teegi, funktsioonide komplekti jne kujul, mida tünn ja skelett oma töö tegemiseks kasutavad.

Seega peab igal programmil olema mingisugune ORB esitus, et suhelda teiste CORBA klientide ja serveritega teistes masinates.

Kuid loogilisest vaatenurgast vaadeldakse ORB-d kui kihti, mis ühendab tegelikult ja sujuvalt nii kliente kui ka servereid, nii et isegi kui C++ rakendusel on mõni ORB-rakendus, mis on kirjutatud C++-s ja Java-rakendus, on ORB-i Java-s kirjutatud. on maagiline standardprotokollid(GIOP, IIOP), saavad nad omavahel probleemideta suhelda.


Aruanne peab sisaldama:

    Hästi toimiva programmiga lahendatud probleemi avaldus.

    Silutud programmi kasutusjuhend, mis sisaldab kõigi programmi funktsioonide liideste kirjeldust.

    Programmide loetelu koos vajalike kommentaaridega.

  1. Kontrollküsimused

          Mis on CORBA?

          Mis on juhtunud IDL? Milleks see mõeldud on?

          Kuidas klient ja server suhtlevad?CORBA?

          Kuidas nende vahel andmeid edastatakse?

          Mille jaoks on nimeserver?

          Kuidas see algab CORBA server?

  1. Kirjandus

    Ken Arnold, James Gosling, David Holmes.Java™ programmeerimiskeel.

    Ametlik saitJavahttp:// java. päike. com/ (seal on venekeelne lõik koos õpikuga).

    Java™ 2 SDK, standardväljaande dokumentatsioon – http://java.sun.com/products/jdk/1.5/index.html.

    James Gosling, Bill Joy, Guy Steele.Keele spetsifikatsioon Java ( Java keele spetsifikatsioon http :// www . javasoft . com / dok / raamatuid / jls /). Vene keelde tõlkimine -http:// www. uni- vologda. ac. ru/ java/ jls/ indeks. html

    Projekti ametlik veebisaitVarjutushttp:// www. varjutus. org/.

  1. Lisa 1. CORBA

Tehnoloogia CORBA (LevinudObjektTaotlusMaaklerArhitektuur) on konsortsiumi pakutud hajutatud rakenduste kirjutamise standardOMG (AvatudJuhtimineGrupp). CORBA objekte luues saame näiteks oluliselt vähendada aega, mis kulub palju arvutusi nõudvate probleemide lahendamiseks. See on võimalik CORBA objektide paigutamisega erinevatele masinatele. Iga kaugobjekt lahendab konkreetse alamülesande, vabastades seeläbi kliendi tarbetust tööst.

CORBA tuum on objektipäringu vahendaja. ORB haldab objektide interaktsiooni hajutatud võrgukeskkonnas. IIOP (Internet Inter-ORB Protocol) on spetsiaalne protokoll ORB-de interaktsiooniks.

Kliendi aadressiruumis töötab spetsiaalne objekt nimega stub. Saanud kliendilt päringu, pakib see päringu parameetrid spetsiaalsesse vormingusse ja edastab selle serverisse või õigemini skeletti.

Skelett on objekt, mis töötab serveri aadressiruumis. Saanud kliendilt päringu, pakib ta selle lahti ja saadab serverisse. Skelett teisendab ka serveri vastused ja edastab need kliendile (stub).

Java-tehnoloogia abil mis tahes CORBA rakenduse kirjutamiseks peab teil olema kaks asja - installitud pakett JDK1.5 ja idlj kompilaator (…\ jdk 1.5.0\ prügikast\ idlj. exe). JDK pakub CORBA objektidega töötamiseks klasside komplekti ja idlj kaardistab IDL-keele Java-ga.

6 .1 Lihtsa CORBA rakenduse loomine

      1. Liidese kirjutamine

Loomine CORBA rakendused sisse Javaalgab liidese kirjutamisega kaugobjektile, kasutades liidese kirjelduskeelt (LiidesDefinitsioonKeel, IDL).

Loomefailitere.idl

moodul HelloApp

liides Tere

string sayTere();

oneway void shutdown();

See liides kirjeldab ainult kahte meetoditLülita välja Ja ütle Tere . Pealegi pole meie jaoks oluline, mida need meetodid teevad, peamine on see, et me teeme kindlaks nende olemasolu ja määrame kindlaks, millised sisend- ja väljundparameetrid neil on.

Järgmisena peaksite käivitama kompilaatoriIDL- juurde- Javaidlj:

idlj – sügisTere. idl

Praegusesse kataloogi on ilmunud uus kaustTere Rakendus , mis sisaldab kuut Java-faili. Igal neist on oma eesmärk.

    TerePOA. javajava– abstraktne klass, mis pole midagi muud kui serveri skelett (skelett) ja pakub serveri funktsioone.

    _ TereStub. java– klass, mis rakendab tünn ( tünn) klient. Pakubkliendi funktsionaalsus.

    TereAbimees. java Ja TereHolder. java– klassid, mis pakuvad abifunktsiooneCORBA objektid.

    HelloOperations. java– klass, mis sisaldab liidese kirjeldustTere keeles Java.

    Tere. java– klass – pärijaHelloOperations, toetav liidesorg. omg. CORBA. Objekt.

      1. Serveri loomine

Nüüd on meie ülesandeks kirjutada klass, mis rakendab liidestTere . Meie puhul saab see olemaTereImpl . Pange tähele, et see on selle klassi järeltulijaTerePOA . IN TereImpl aastal deklareeritud meetodidTere . idl .

Ülesande lihtsustamiseks võib failist võtta meetodite deklaratsiooni TereOperatsioonid . java , loodud jdlj .

privaatne ORB orb;

orb = orb_val;

avalik string sayHello() (

tagasta "\nTere maailm!!\n";

public void shutdown() (

orb.shutdown(false);

Järgmine samm on tegeliku loomineserveri osa rakendusest. Sellest saab klassTereServer.

Sellel on ainult üks meetod - standardfunktsioonpeamine.

Esimese asjana loome ORB-i. Seejärel loome kaugobjektiklassi eksemplari (TereImpl) ja registreerige see ORB-is. Järgmisena kutsume välja spetsiaalse nimeteenuse (NameService) ja registreerime selles kaugobjekti nime, et klient selle üles leiaks.

Vaatame neid etappe lähemalt.

1. ORB loomine ja initsialiseerimine. Toodetud staatilise meetodi kutsumisegaselles ORB klass

2. Kaugobjektiklassi eksemplari loomine ja selle registreerimine ORB-is

tereImpl.setORB(orb);

3. Nimekonteksti hankimine (NamingContext)

org.omg.CORBA. Objekt objRef =

Esimesel real saame objektiviide nimeteenusele (NameService). Kuid tegelikult on see tavaline CORBA objekt ja selleks, et seda nimetamiskontekstina kasutada (NamingContext), peate kutsuma meetodikitsas klass NamingContextHelper , mis näib täpsustavat seda CORBA objekti.

4. Kaugobjekti nime registreerimine (TereImpl)

Stringi nimi = "Tere";

ncRef. uuesti siduda (tee, href);

Nimi registreeritakse, et klient saaks kaugobjekti leida. Seda eesmärki täidab funktsioonuuesti siduda (NameComponentnc, Objektobj) liides NamingContext.

5. Kliendi päringute ootamine

orb. jooksma();

Server on nüüd kasutamiseks valmis.

// TereServer.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg.CORBA.*;

import org.omg. PortableServer.*;

import org.omg. PortableServer.POA;

importida java.util. Omadused;

klass HelloImpl laiendab HelloPOA (

privaatne ORB orb;

public void setORB(ORB orb_val) (

orb = orb_val;

// rakendame meetodit sayHello().

avalik string sayHello() (

tagasta "\nTere maailm!!\n";

// rakendage shutdown() meetod

public void shutdown() (

orb.shutdown(false);

avalik klass HelloServer(

avalik static void main (String args) (

proovi (

ORB orb = ORB.init(args, null);

// hankige viide rootpoale ja aktiveerige POAManager

POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

rootpoa.the_POAManager().activate();

// loo teenindaja ja registreeri see ORB-s

HelloImpl tereImpl = new HelloImpl();

tereImpl.setORB(orb);

// saada teenindajalt objektiviide

org.omg.CORBA. Objekti ref = rootpoa.servant_to_reference(tereImpl);

Tere href = HelloHelper.narrow(ref);

// NameService kutsub välja nimeteenuse

orb.resolve_initial_references("Nimiteenus");

// Kasutage NamingContextExti, mis on koostalitlusvõime osa

// Nimeteenuse (INS) spetsifikatsioon.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// seotakse nimede andmises objektiviide

Stringi nimi = "Tere";

NimiComponent tee = ncRef.to_name(nimi);

ncRef.rebind(tee, href);

System.out.println("TereServer valmis ja ootab...");

// ootama klientide kutseid

orb.run();

püüda (erand e) (

System.err.println("VIGA:" + e);

System.out.println("TereServer väljub...");

      1. Kliendi loomine

Liigume edasi kliendi jaoks koodi kirjutamise juurde.

Klienditaotluse kirjutamise põhietapid

    ORB loomine ja initsialiseerimine

    Nimeteenuse konteksti hankimine (NamingContext)

    Kaugobjekti leidmine

    SayHello meetodi kutsumine.

    Väljalülitusmeetodi kutsumine.

Nagu näete, langevad esimesed kaks punkti kokku serverirakenduse loomise etappidega, seega me neid ei arvesta.

Kolmas punkt on samuti üsna lihtne rakendada. Objekt luuakseNameComponent. Meetodit nimetatakselahendada (NameComponenttee), mis otsib kaugobjekti nime järgi (standardneCORBAobjekt). Meetodi kasutaminekitsas (org. omg. CORBA. Objektobj) klass tereAitaja(genereeritudidljkompilaator) saame objektiviide liideseleTere.

Stringi nimi = "Tere";

Nüüd saate seda meetodit kutsudaütle Tere:

meetodLülita väljalülitab serveri välja.

helloImpl.shutdown();

//testClient.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg. CosNaming. NamingContextPackage.*;

import org.omg.CORBA.*;

avalik klass HelloClient

{

staatiline Tere helloImpl;

avalik staatiline tühimik (string args)

{

proovi (

// looge ja lähtestage ORB

ORB orb = ORB.init(args, null);

// hankige juurnimede kontekst

org.omg.CORBA. Objekt objRef =

orb.resolve_initial_references("Nimiteenus");

// Kasutage NamingContexti asemel NamingContextExti. See on

// koostalitlusvõimelise nimetamisteenuse osa.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// lahendage nimede andmises objektiviide

Stringi nimi = "Tere";

helloImpl = TereHelper.narrow(ncRef.resolve_str(nimi));

System.out.println("Serveri objektil on käepide:" + helloImpl);

System.out.println(tereImpl.sayTere());

helloImpl.shutdown();

) saak (erand e) (

System.out.println("VIGA:" + e);

e.printStackTrace(System.out);

}

}

}

      1. Koostamine Ja käivitada rakendusi

FailidTereServer. java ja HelloClient. java, Tere. idlja kaustHelloApp, loodudidkj. exetuleb salvestada ühte kausta.

Kliendi ja serveri kompileerimiseks peate käsurida dial

javac *.java HelloApp/*.java

javac. exeasub …\jdk1.5.0\ prügikast.

kolmapäevalVarjutusei luba joostaCORBArakendusi. Alustuseks

1. Käivitage teenusorbdObjekt Taotlus Maakler Deemon (…\ jdk1.5.0\ prügikast\ orbd. exe). Seda tehakse selleks, et saaksime viite nimetamisteenusele.

alustada orbdORBIinitialPort 1050

Parameeter -ORBIinitialPort– pordi number, millel nimeserver töötab.

2. Käivitage serverid

nimeserver.

3. Käivitage klient

Määrab pordi, millel nimeserver töötab. Parameeter – ORBInitialHost määrab hosti, millel see töötabnimeserver.

Koostamise ja käivitamise hõlbustamiseks saate luuanahkhiirfail:

idlj – sügis Tere.idl

javac *.java HelloApp/*.java

käivita java HelloServer – ORBInitialPort 1050 – ORBInitialHost localhost

java HelloClient – ​​ORBInitialPort 1050 – ORBInitialHost kohalik host


6.2 IDL keel

KeelOMG IDL (Liides Definitsioon Keel– Interface Description Language) on tehnoloogiast sõltumatu süntaks objektiliideste kirjeldamiseks. Tarkvaraarhitektuuride kirjeldamiselOMG IDLon suurepäraselt kasutatav universaalse tähisena objekti piiride määratlemiseks, mis määravad selle käitumise infosüsteemi teiste komponentide suhtes.OMG IDLvõimaldab kirjeldada liideseid, millel on erinevad meetodid ja atribuudid. Keel toetab ka liidese pärimist, mis on vajalik taaskasuta objektid nende laiendamise või täpsustamise võimalusega.

IDLon puhtalt deklaratiivne keel, see tähendab, et see ei sisalda teostust.IDLspetsifikatsioone saab koostada (kuvada) päisefailideks ja spetsiaalseteks serveri prototüüpideks, mida programmeerija saab otse kasutada. See onIDLteatud meetodeid saab kirjutada ja seejärel käivitada mis tahes keeles, mille jaoks on vastendus olemasIDL. Sellised keeled hõlmavadC, C++, SmallTalk, Pascal, Java, Ada.

KasutadesIDLSaate kirjeldada komponendi atribuute ja selle pärivaid vanemklasse, väljaviskatud erandeid ja lõpuks liidest määratlevaid meetodeid koos sisend- ja väljundparameetrite kirjeldusega.

StruktuurCORBA IDLfail näeb välja selline:

moodul(

;

;

;

liides [: ] (

;

;

;

;

()

.

.

()

.

.

}

liides [:]

.

.

}

Keele süntaksIDLSee on üsna mahukas ja seda ei ole võimalik õpetamisjuhendis kirjeldada.

Meiliserveri liidese rakendamiseks saate lisadaTere. idl

moodul HelloApp

{

struct TMessage

{

string To;

string From;

string Sõnum;

};

typedef jada TMessages;

liides Tere

{

TMessages GetMessages (stringis Nimi, välja lühike arv);

oneway void Saada (stringis Klient, stringis Nimi, stringis Sõnum);

string sayTere();

oneway void shutdown();

};

};

typedef jada TMessages; teadaanne tüüp dünaamiline massiivi sõnumeidTMessage.

CORBA (Common Object Request Broker Architecture)- objektorienteeritud tehnoloogia hajutatud rakenduste loomiseks. Tehnoloogia põhineb kasutusel Objektipäringu vahendaja (ORB) objektide päringute läbipaistvaks saatmiseks ja vastuvõtmiseks hajutatud keskkonnas. Tehnoloogia võimaldab teil luua rakendusi erinevates programmeerimiskeeltes rakendatud hajutatud objektidest. Standard CORBA arenenud Objektihaldusrühm (OMG).

CORBA arhitektuur

IN see jaotis antakse lühike ülevaade CORBA nagu spetsifikatsioonis kirjeldatud OMG versioon 3.0. Selle dokumendi nõuded võivad tegelike rakenduste järgi olla erineval määral täidetud. objektipäringu maaklerid. Joonisel fig. Joonisel 2.1 on kujutatud kliendi poolt objektirakendusele saadetud päring. Klient on olem, mis soovib sooritada toimingut objektiga ja Rakendamine on koodi ja andmete kogum, mis objekti tegelikult rakendab.

ORB vastutab kõigi mehhanismide eest, mis on vajalikud päringu jaoks objektile sobiva teostuse leidmiseks, teostuse ettevalmistamiseks päringu vastuvõtmiseks ja andmeedastus pooleli palve täita. Kliendile nähtav liides on täiesti sõltumatu objekti realisatsiooni asukohast, programmeerimiskeelest, milles see on kirjutatud, ja muudest aspektidest, mida liidese spetsifikatsioon ei kajasta.

Dünaamilise kõne liidesel ja stub-liidesel on sama semantika, nii et sõnumi saaja ei saa kindlaks teha, kuidas päring saadeti. ORB leiab sobiva objekti rakenduskoodi, saadab sellele parameetrid ja annab juhtimise kaudu IDL skelett või dünaamiline skelett (joon. 2.4). Skeletid on spetsiifilised konkreetse liidese ja objektiadapteri jaoks. Päringu täitmise ajal võib rakendus kasutada mõningaid teenuseid ORB objektiadapteri kaudu. Kui päring on täidetud, tagastatakse kliendile kontroll- ja tulemuste väärtused.

Objekti juurutus saab valida, millist objektiadapterit kasutada, sõltuvalt sellest, milliseid teenuseid see vajab. Joonisel fig. Joonis 2.5 näitab, kuidas liidese ja juurutamise teave tehakse kättesaadavaks klientidele ja objektide rakendustele. Liidesed on kirjeldatud artiklis IDL või liidese hoidla abil. Nende kirjeldusi kasutatakse juurutamiseks kliendi tünnide ja skelettide genereerimiseks.

Teave objekti juurutamise kohta antakse installimise ajal ja salvestatakse juurutamise hoidlas ning seejärel kasutatakse päringu edastamisel.

Aleksander Godin

CORBA tehnoloogia on standard hajutatud rakenduste kirjutamiseks, mille on välja pakkunud OMG (Open Management Group) konsortsium. CORBA objekte luues saame näiteks oluliselt vähendada aega, mis kulub palju arvutusi nõudvate probleemide lahendamiseks. See on võimalik CORBA objektide paigutamisega erinevatele masinatele. Iga kaugobjekt lahendab konkreetse alamülesande, vabastades seeläbi kliendi tarbetust tööst.

Vaatleme objektide vastasmõju CORBA arhitektuuris

Joonis 1 Objektide interaktsioon CORBA arhitektuuris

CORBA tuum on objektipäringu vahendaja. ORB haldab objektide interaktsiooni hajutatud võrgukeskkonnas. IIOP (Internet Inter-ORB Protocol) on spetsiaalne protokoll ORB-de interaktsiooniks.

Kliendi aadressiruumis töötab spetsiaalne objekt nimega stub. Saanud kliendilt päringu, pakib see päringu parameetrid spetsiaalsesse vormingusse ja edastab selle serverisse või õigemini skeletti.

Skelett on objekt, mis töötab serveri aadressiruumis. Saanud kliendilt päringu, pakib ta selle lahti ja saadab serverisse. Skelett teisendab ka serveri vastused ja edastab need kliendile (stub).

Java-tehnoloogiat kasutades mis tahes CORBA rakenduse kirjutamiseks peab teil olema kaks asja - installitud pakett JDK1.2 ja kompilaator idltojava. JDK pakub CORBA objektidega töötamiseks klasside komplekti ja idltojava kaardistab IDL keele Javaga.

Javas CORBA rakenduse loomine algab liidese kirjutamisega kaugobjektile, kasutades liidese määratluskeelt (IDL).

Loome faili test.idl moodul testApp ( liidese test ( long count (string msg); ); );

See liides kirjeldab ainult ühte meetodit loendama. Pealegi pole meie jaoks oluline, mida see meetod teeb, peamine on see, et me teeme kindlaks selle olemasolu, määrame kindlaks, millised sisend- ja väljundparameetrid sellel on.

Kasutame kompilaatorit idltojava.

Idltojava Tere.idl Märge. See kompilaator kasutab vaikimisi C++ keele eelprotsessorit, seega ei pea see veateadetega tegelema Käsu või faili nimi on vale(selle tee peab olema määratud CPP keskkonnamuutujas) keelake selle kasutamine lippude määramisega. idltojava -fno-cpp Hello.idl Selle programmi tulemust saab esitada diagrammi kujul.

Joon.2 Idltojava kompilaatori töö
Praegusesse kataloogi on ilmunud uus kaust testApp, mis sisaldab viit Java-faili. Igal neist on oma eesmärk.

_testImplBase.java – abstraktne klass, mis pole midagi muud kui serveri skelett (skelett) ja pakub serveri funktsionaalsust;

_testStub.java - klass, mis rakendab kliendi tünni. Pakub kliendi funktsioone;

test.java - klass, mis sisaldab Java testliidese kirjeldust;

testHelper.java Ja testHolder.java - klassid, mis pakuvad CORBA objektide jaoks kasulikke funktsioone.

Nüüd on meie ülesandeks kirjutada klass, mis rakendab liidest test. Sellised klassid tuleks nimetada nii, et nende nimi sisaldaks sõna "teenija", meie puhul see nii on testTeenija.

Class testServant laiendab _testImplBase ( public int count(String msg) ( return msg.length(); ) )

Pange tähele, et see klass on päritud _testImplBase. Nagu näete, on siin rakendatud loendusmeetodit, mis on sisse lülitatud selles näites Loendab vastuvõetud sõnumis olevate tähtede arvu.

Liigume nüüd edasi rakenduse serveriosa kirjutamise juurde.

Esimese asjana loome ORB-i. Seejärel loome kaugobjektiklassi eksemplari (testServant) ja registreerime selle ORB-is. Järgmiseks kutsume välja spetsiaalse nimeteenuse (NameService) ja registreerime selles kaugobjekti nime, et klient selle üles leiaks (kaugobjekti leidmiseks on ka teine ​​võimalus, aga sellest hiljem).

Vaatame neid etappe lähemalt.

  1. ORB loomine ja initsialiseerimine. Toodetud staatilise meetodi kutsumisega selles ORB klass

    ORB orb = ORB.init();

  2. Kaugobjektiklassi eksemplari loomine ja selle registreerimine ORB-is

    testServant testRef = new testServant();

    orb.connect(testRef);

  3. Nime konteksti hankimine (NamingContext)

    org.omg.CORBA.Object objRef =

    orb.resolve_initial_references("Nimiteenus");

    NamingContext ncRef = NamingContextHelper.narrow(objRef);

    esimesel real saame objektiviide nimeteenusele (NameService). Kuid tegelikult on see tavaline CORBA objekt ja selleks, et seda nimetamiskontekstina kasutada (NamingContext), peate kutsuma meetodi kitsas klass NamingContextHelper, mis näib täpsustavat seda CORBA objekti.

  4. Kaugobjekti nime registreerimine (testServant)

    Nagu varem mainitud, toimub nime registreerimine selleks, et klient saaks kaugobjekti üles leida. Seda eesmärki täidab funktsioon rebind (nimiComponent nc, Object Obj) liides NamingContext.

    NameComponent nc = new NameComponent("test", ""); //esimene parameeter //näitab objekti nimi, //me ei pea kasutama teist NameComponent path = (nc); ncRef.rebind(tee, testRef);

  5. Ootan kliendi taotlusi. java.lang.Object sync = uus java.lang.Object(); sünkroonitud (sünkroonimine) ( sync.wait(); )

    Pärast seda, kui server töötleb kliendi päringu ja täidab meetodi loendama see läheb uuesti ooterežiimi.

Server on nüüd kasutamiseks valmis

Nimekiri 1. testServer.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.lang.*; class testServant laiendab _testImplBase ( public int count(String msg) ( return msg.length(); ) ) public class testServer ( public static void main(String args) ( proovige ( ORB orb = ORB.init(args, null); testServant testRef = new testServant( testRef org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NameComponent tee = (nc ncRef.rebind(path, testRef); ("VIGA: " + e.printStackTrace(System.out ) ));

Pange tähele, et kõik CORBA objektidega tehtavad toimingud sisalduvad try-catch plokis.

Liigume edasi kliendi jaoks koodi kirjutamise juurde.

Klienditaotluse kirjutamise põhietapid

  1. ORB loomine ja initsialiseerimine
  2. Nimeteenuse konteksti hankimine ( NamingContext)
  3. Kaugobjekti leidmine
  4. Meetodi kutsumine loendama.

Nagu näete, langevad esimesed kaks punkti kokku serverirakenduse loomise etappidega, seega me neid ei arvesta.

Kolmas punkt on samuti üsna lihtne rakendada. Objekt luuakse NameComponent. Meetodit nimetatakse lahenda (nimiComponent tee), mis otsib kaugobjekti (standardne CORBA objekt) nime järgi. Meetodi kasutamine kitsas(org.omg.CORBA.Object obj) klass testHelper(genereeritud idltojava kompilaator) saame objektiviide liidesele test.

NameComponent nc = new NameComponent("test", ""); NimiKomponenti tee = (nc); org.omg.CORBA.Object obj= ncRef.resolve(path); test testRef = testHelper.narrow(obj);

Nüüd saate seda meetodit kutsuda loendama

String msg = "proovige loendada"; int count = testRef.count(msg);

Nimekiri 2. testClient.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; import java.lang.*; public class testClient ( public static void main(String args) ( proovige ( ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper. kitsas(objRef); "märkide arv sõnumis on:" + arv ) püüdmine (Erand e) ( System.out.println("VIGA: " + e) ​​​​; e.printStackTrace(System.out);

Rakenduse käivitamine

  1. Nimeserveri käivitamine (kaasas JDK1.2-ga). Seda tehakse selleks, et saaksime lingi tnameservi nimeteenusele

    vaikimisi käivitub server pordist 900. Seda väärtust saab muuta, määrates näiteks käivitamisparameetri -ORBInitialPort

    Tnameserv -ORBIinitialPort 1024

  2. Serveri käivitamine testserver java testServer -ORBInitialPort 1024 // näitab porti, //millel nimeserver töötab
  3. Kliendi käivitamine testClient java testClient -ORBInitialHost javas.stu.neva.ru -ORBInitialPort 1024

    parameeter -ORBInitialHost määrab hosti, millel see töötab testserver

pärast selle rakenduse käivitamist kuvatakse konsool

Tähemärkide arv sõnumis on:12

Ühenduse loomine serveriga ilma nimeteenust kasutamata

Selle meetodi põhiidee seisneb selles, et server salvestab kaugobjekti klassi eksemplari ( testTeenija) nagu tekstifail kuhu iganes, kliendile kättesaadav. Klient laadib andmed failist (objekti String) ja teisendab spetsiaalsete meetodite abil objektiviideteks kaugobjektile.

Kõik see viiakse ellu järgmiselt

Eemaldame osa koodist – see kehtib ka kliendi ( testServer.java Ja testClient.java)

  1. Jätame imporditeegist välja org.omg.CosNaming.*. org.omg.CosNaming.NamingContextPackage.*;
  2. Kustutame sammule 3-punktile 4 vastava koodi
Kaugkoodi asemel sisestame - serveri jaoks: //objekti teisendamine stringiks String ior = orb.object_to_string(testRef); String failinimi = System.getProperty("kasutaja.kodu") + System.getProperty("file.separator")+"test_file"; //loo faili test_fail FileOutputStream fos = new FileOutputStream(failinimi); PrintStream ps = new PrintStream(fos); //kirjutada sinna andmed ps.print(ior); ps.close();

kliendi jaoks:

String failinimi = System.getProperty("kasutaja.kodu") + System.getProperty("file.separator")+"test_file"; //ava faili FileInputStream fis = new FileInputStream(failinimi); DataInputStream dis = new DataInputStream(fis); //andmete lugemine String ior = dis.readLine(); //teisenda CORBA objektiks org.omg.CORBA.Object obj = orb.string_to_object(ior); //saada viide kaugobjekti testile testRef = testHelper.narrow(obj);

Kompileerime rakendused, käivitame serveri ja kliendi samamoodi nagu varem (käivita nimeserver sel juhul Pole tarvis).