Aplikasi CORBA yang mudah - lakukan sendiri. Teknologi CORBA (Common Object Request Broker Architecture).

Biasakan diri anda dengan bahan teori yang dibentangkan dalam lampiran kepada garis panduan dan contoh program ini. Baca teks tugasan kerja makmal, cadangkan penempatan dan kefungsian komponen untuk memenuhi keperluan tugasan makmal, dan tulis program.

2. Tugasan makmal

Membangunkan pelanggan mel dan pelayan. Pelanggan - aplikasi tingkap, yang akan membolehkan anda menghantar dan menerima mesej daripada pelayan. Pengenalpastian pelanggan pada pelayan, protokol pemindahan mesej adalah mengikut budi bicara pelajar.

Pelayan boleh menjadi aplikasi konsol. Anda boleh menyimpan mesej dalam fail teks. Adalah disyorkan untuk membuat pelayan berbilang benang.

Untuk berinteraksi antara pelanggan dan pelayan, gunakan teknologi CORBA.

Sebagai tambahan, adalah dicadangkan untuk melaksanakan pelayan atau klien bukan dalam Java.

3. Kandungan laporan

Laporan mesti mengandungi:

1. Pernyataan masalah yang diselesaikan oleh program yang berfungsi dengan baik.

2. Manual pengguna atur cara yang dinyahpepijat, mengandungi perihalan antara muka semua fungsi program.

3. Penyenaraian program dengan komen yang diperlukan.

4. Soalan kawalan

1. Apakah itu CORBA?

2. Apakah itu IDL? Untuk apa itu?

3. Bagaimanakah klien dan pelayan berinteraksi dalam CORBA?

4. Bagaimanakah data dipindahkan antara mereka?

5. Untuk apa pelayan nama?

6. Bagaimanakah anda memulakan pelayan CORBA?

5. kesusasteraan

1. Ken Arnold, James Gosling, David Holmes. Bahasa pengaturcaraan Java™.

2. Laman web rasmi Java – http://java.sun.com/ (terdapat bahagian dalam bahasa Rusia dengan buku teks).

3. Java™ 2 SDK, Edisi Piawai Dokumentasi - http://java.sun.com/products/jdk/1.5/index.html.

4. James Gosling, Bill Joy, Guy Steele. Spesifikasi bahasa Jawa(Spesifikasi Bahasa Java – http://www.javasoft.com/docs/books/jls/). Terjemahan ke dalam bahasa Rusia – http://www.uni-vologda.ac.ru/java/jls/index.html

5. Laman web rasmi projek Eclipse ialah http://www.eclipse.org/.

6. Lampiran 1. CORBA

teknologi CORBA(Common Object Request Broker Architecture) ialah standard penulisan aplikasi yang diedarkan, yang dicadangkan oleh konsortium OMG (Open Management Group). Dengan mencipta objek CORBA, kita boleh, sebagai contoh, mengurangkan dengan ketara masa yang diperlukan untuk menyelesaikan masalah yang memerlukan jumlah pengiraan yang besar. Ini boleh dilakukan dengan meletakkan objek CORBA kereta yang berbeza. Setiap objek jauh menyelesaikan subtugas tertentu, dengan itu melegakan pelanggan daripada kerja yang tidak perlu.

Teras CORBA ialah Broker Permintaan Objek. ORB menguruskan interaksi objek dalam persekitaran rangkaian teragih. IIOP (Internet Inter-ORB Protocol) ialah protokol khas untuk interaksi antara ORB.

Objek khas yang dipanggil stub beroperasi dalam ruang alamat pelanggan. Setelah menerima permintaan daripada pelanggan, ia membungkus parameter permintaan ke dalam format khas dan menghantarnya ke pelayan, atau lebih tepatnya ke rangka.

Skeleton ialah objek yang beroperasi dalam ruang alamat pelayan. Setelah menerima permintaan daripada pelanggan, ia membongkarnya dan menghantarnya ke pelayan. Rangka juga menukar respons pelayan dan menghantarnya kepada klien (stub).

Untuk menulis sebarang aplikasi CORBA menggunakan teknologi Java, anda perlu mempunyai dua perkara - ini pakej yang dipasang JDK1.5 dan pengkompil idlj (...\jdk1.5.0\bin\idlj.exe). JDK menyediakan satu set kelas untuk bekerja dengan objek CORBA, dan idlj memetakan bahasa IDL ke Java.

6.1 Mencipta aplikasi CORBA yang mudah

6.1.1 Menulis antara muka

Mencipta aplikasi CORBA dalam Java bermula dengan menulis antara muka untuk objek jauh menggunakan Bahasa Definisi Antara Muka (IDL).

Mari buat fail hello.idl

Modul HelloApp(antara muka Hello(string sayHello();oneway void shutdown();););

Antara muka ini menerangkan hanya dua kaedah, penutupan dan katakan hai. Lebih-lebih lagi, tidak penting bagi kami apa kaedah ini lakukan, perkara utama ialah kami menentukan ia wujud dan menentukan parameter input dan output yang mereka ada.

idlj – jatuh Hello.idl

Muncul dalam direktori semasa Fail baharu Hello Aplikasi, yang mengandungi enam fail java. Setiap daripada mereka mempunyai tujuan tersendiri.

· HelloPOA.java java ialah kelas abstrak yang tidak lebih daripada rangka pelayan (rangka) dan menyediakan fungsi pelayan.

· _HelloStub.java – kelas yang melaksanakan stub klien. Menyediakan fungsi pelanggan.

HelloHelper.java dan HelloHolder.java ialah kelas yang menyediakan fungsi sekunder untuk objek CORBA.

· HelloOperations.java – kelas yang mengandungi penerangan antara muka hello dalam Java.

· Hello.java – kelas yang merupakan pengganti HelloOperations, menyokong antara muka org.omg.CORBA. Objek.

6.1.2 Mencipta pelayan

Sekarang tugas kita ialah menulis kelas yang melaksanakan antara muka hello. Dalam kes kami ia akan menjadi HelloImpl. Sila ambil perhatian bahawa ia adalah keturunan kelas HelloPOA. DALAM HelloImpl kaedah yang diisytiharkan dalam Hello . terbiar .

Untuk memudahkan tugas, pengisytiharan kaedah boleh diambil dari fail HelloOperations . java , dihasilkan jdlj .

Kelas HelloImpl memanjangkan HelloPOA (pribadi ORB orb; public void setORB (ORB orb_val) (orb = orb_val;) // laksanakan sayHello() methodpublic String sayHello() (kembali "\nHello world!!\n";) // laksanakan shutdown() methodpublic void shutdown() (orb .shutdown(false);))

Langkah seterusnya ialah membuat bahagian pelayan sebenar aplikasi. Ini akan menjadi kelas HelloServer.

Ia akan mempunyai hanya satu kaedah - fungsi utama standard.

Perkara pertama yang kita lakukan ialah mencipta ORB. Kemudian kami mencipta contoh kelas objek jauh (HelloImpl) dan mendaftarkannya dalam ORB. Seterusnya kita telefon perkhidmatan khas nama (NameService) dan daftarkan nama objek jauh di dalamnya supaya pelanggan dapat mencarinya.

Mari kita lihat lebih dekat pada peringkat ini.

1. Penciptaan dan permulaan ORB. Dihasilkan dengan memanggil kaedah statik di dalamnya kelas ORB

2. Mencipta contoh kelas objek jauh dan mendaftarkannya dalam ORB

helloImpl.setORB(orb);

3. Mendapatkan konteks penamaan (NamingContext)

org.omg.CORBA. Objek objRef = orb.resolve_initial_references("NameService");

Dalam baris pertama kita mendapat rujukan objek kepada perkhidmatan nama (NameService). Tetapi sebenarnya ini adalah objek CORBA biasa dan untuk menggunakannya sebagai konteks penamaan (NamingContext), anda perlu memanggil kaedah sempit kelas PenamaanContextHelper, yang nampaknya menentukan objek CORBA ini.

4. Mendaftar nama objek jauh (HelloImpl)

Nama rentetan = "Hello";

ncRef.rebind(path, href);

Nama didaftarkan supaya pelanggan dapat mencari objek jauh. Fungsi rebind (NameComponent nc, Object obj) antara muka NamingContext berfungsi untuk tujuan ini.

5. Menunggu permintaan daripada pelanggan

Pelayan kini sedia untuk digunakan.

// 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. Properties;class HelloImpl memanjangkan HelloPOA (orb ORB peribadi; setORB kosong awam (orb_val ORB) (orb = orb_val;) // laksanakan sayHello() methodpublic String sayHello() (kembali "\nHello world!!\n";) // laksana shutdown() methodpublic void shutdown() (orb.shutdown(false);))

kelas awam HelloServer(

utama kekosongan statik awam (String args) (

// buat dan mulakan ORB

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

// dapatkan rujukan kepada rootpoa & aktifkan POAManager

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

rootpoa.the_POAManager().activate();

// buat pelayan dan daftarkannya dengan ORB

HelloImpl helloImpl = new HelloImpl();

helloImpl.setORB(orb);

// dapatkan rujukan objek daripada hamba

org.omg.CORBA. Objek ref = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.narrow(ref);

// dapatkan konteks penamaan akar

// NameService menggunakan perkhidmatan nama

org.omg.CORBA. Objek objRef =

orb.resolve_initial_references("NameService");

// Gunakan NamingContextExt yang merupakan sebahagian daripada Interoperable

// Spesifikasi Perkhidmatan Penamaan (INS).

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// mengikat Rujukan Objek dalam Penamaan

Nama rentetan = "Hello";

Laluan NameComponent = ncRef.to_name(name);

ncRef.rebind(path, href);

System.out.println("HelloServer sedia dan menunggu...");

// tunggu permohonan daripada pelanggan

tangkapan (Pengecualian e) (

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

e.printStackTrace(System.out);

System.out.println("HelloServer Keluar...");

6.1.3 Mewujudkan klien

Mari kita beralih kepada menulis kod untuk pelanggan.

Langkah-Langkah Asas Penulisan permohonan pelanggan

1. Penciptaan dan permulaan ORB

2. Mendapatkan konteks perkhidmatan penamaan (NamingContext)

3. Mencari objek jauh

4. Memanggil kaedah sayHello.

5. Memanggil kaedah penutupan.

Seperti yang anda lihat, dua mata pertama bertepatan dengan peringkat membuat aplikasi pelayan, jadi kami tidak akan mempertimbangkannya.

Perkara ketiga juga agak mudah untuk dilaksanakan. Objek NameComponent dicipta. Kaedah penyelesaian (NameComponent path) dipanggil, yang mencari objek jauh (objek CORBA standard) dengan nama. Menggunakan kaedah sempit (org.omg.CORBA. Object obj) kelas helloHelper (dijana oleh pengkompil idlj), kami memperoleh rujukan objek kepada antara muka hello.

Nama rentetan = "Hello";

helloImpl = HelloHelper.narrow(ncRef.resolve_str(nama));

Saya tahu bahawa CORBA membolehkan anda melaksanakan berbilang objek pada perbezaan bahasa pengaturcaraan dan juga dijalankan pada nod pengkomputeran yang berbeza. Walau bagaimanapun, adakah perlu dua ORB berbeza ditulis dalam dua bahasa berbeza?

Contoh: Nod A bermula Aplikasi Java J1, dan nod B menjalankan aplikasi C++ C1. Perlukah saya mendapatkan "Java ORB" untuk Nod A dan "C++ ORB" untuk Nod B atau adakah semua/beberapa ORB saling beroperasi dengan aplikasi yang ditulis dalam mana-mana bahasa yang mempunyai pemetaan IDL?

Saya amat berterima kasih jika seseorang boleh memautkan saya kepada sumber, menyatakannya secara langsung seperti yang saya mahu ia dinyatakan. Yang paling dekat yang saya temui ialah "cara pengaturcara memanipulasi struktur atau kesatuan, membuat panggilan jauh menggunakan proksi, atau melaksanakan antara muka dengan kelas pelayan, dengan cara yang sama dalam semua produk CORBA C++, dengan cara yang sama dalam semua Java produk CORBA, dsb." d. ". Ini membuatkan saya berfikir bahawa saya memerlukan dua ORB, tetapi tidak cukup jelas. Pada asasnya saya ingin tahu sama ada saya boleh mengatakan bahawa "memandangkan ORB ditulis dalam C++, pengaturcara aplikasi juga dilarang menggunakan C++".

terima kasih kepada

3 jawapan

Tidak kira bahasa apa yang ORB dilaksanakan, yang penting ialah ikatan bahasa yang disediakannya. Untuk bahasa L, anda memerlukan orb yang menyediakan pengikatan untuk bahasa L Selalunya orb hanya menyediakan pengikatan untuk bahasa di mana ia sendiri ditulis, tetapi mungkin juga menyediakan pengikatan untuk beberapa bahasa lain.

Tidak. Inti CORBA ialah ia memisahkan komponen sepenuhnya.

Jelas sekali, aplikasi anda mesti menggunakan perpustakaan pelanggan yang boleh berinteraksi dengannya. ORB anda hanya boleh memasang binding untuk satu bahasa, dalam hal ini anda perlu mencari binding lain atau mencari cara untuk berinteraksi dengannya (contohnya, jika anda menggunakan Python, anda masih boleh bekerja dengan perpustakaan C++ jika anda mahu ).

Cuba gunakan teknologi ini.

Terdapat beberapa pendekatan yang boleh digunakan semasa melaksanakan aplikasi CORBA, tetapi secara ringkasnya, ya, rangka kerja ORB mestilah dalam bahasa yang sama dengan pelaksanaan aplikasi anda.

Dalam kedua-dua Java dan C++, pengkompil IDL menjana stub dan rangka yang berfungsi sebagai gam antara rangkaian dan program anda. Anda menyediakan pelaksanaan objek CORBA anda, biasanya mewarisi daripada kelas IDL (rangka) yang dijana pengkompil. Rangka entah bagaimana menerima permintaan daripada pelanggan dan kemudian memanggil pelaksanaan anda. Perkara yang sama berlaku secara terbalik pada sisi pelanggan.

Kedua-dua rangka dan rintisan kemudian menggunakan mekanisme yang disediakan oleh ORB untuk memanggil pelayan dari jauh dan bertindak balas semula, malah termasuk mewujudkan sambungan rangkaian jika pelanggan dan pelayan berada pada mesin yang berbeza. "Sihir" ini dilaksanakan oleh ORB dan mesti ada dalam program anda dalam bentuk perpustakaan, set fungsi, dan lain-lain yang akan digunakan stub dan rangka untuk melakukan kerja.

Jadi setiap program mesti mempunyai beberapa jenis perwakilan ORB untuk berkomunikasi dengan pelanggan dan pelayan CORBA lain pada mesin lain.

Walau bagaimanapun, dari sudut logik, ORB dilihat sebagai lapisan yang benar-benar dan lancar menghubungkan kedua-dua pelanggan dan pelayan, jadi walaupun aplikasi C++ mempunyai beberapa pelaksanaan ORB yang ditulis dalam C++ dan pelaksanaan Java, mempunyai ORB yang ditulis dalam Java adalah ajaib protokol standard(GIOP, IIOP), mereka boleh berkomunikasi antara satu sama lain tanpa sebarang masalah.


Laporan mesti mengandungi:

    Pernyataan masalah yang diselesaikan oleh program yang berfungsi dengan baik.

    Panduan pengguna untuk atur cara yang dinyahpepijat, mengandungi perihalan antara muka semua fungsi program.

    Penyenaraian program dengan komen yang diperlukan.

  1. Soalan kawalan

          Apa itu CORBA?

          Apa dah jadi IDL? Untuk apa itu?

          Bagaimanakah klien dan pelayan berinteraksi?CORBA?

          Bagaimanakah data dipindahkan antara mereka?

          Untuk apa pelayan nama?

          Bagaimana ia bermula CORBA pelayan?

  1. kesusasteraan

    Ken Arnold, James Gosling, David Holmes.Bahasa pengaturcaraan Java™.

    Laman rasmiJawahttp:// java. matahari. com/ (terdapat bahagian dalam bahasa Rusia dengan buku teks).

    Java™ 2 SDK, Dokumentasi Edisi Standard - http://java.sun.com/products/jdk/1.5/index.html.

    James Gosling, Bill Joy, Guy Steele.Spesifikasi bahasa Jawa ( Spesifikasi Bahasa Java http :// www . javasoft . com / dokumen / buku / jls /). Menterjemah ke bahasa Rusia -http:// www. uni- vologda. ac. ru/ java/ jls/ indeks. html

    Laman web projek rasmiGerhanahttp:// www. gerhana. org/.

  1. Lampiran 1. CORBA

Teknologi CORBA (BiasaObjekPermintaanBrokerSeni bina) ialah piawaian untuk menulis aplikasi teragih yang dicadangkan oleh konsortiumOh Tuhan (BukaPengurusanKumpulan). Dengan mencipta objek CORBA, kita boleh, sebagai contoh, mengurangkan dengan ketara masa yang diperlukan untuk menyelesaikan masalah yang memerlukan jumlah pengiraan yang besar. Ini boleh dilakukan dengan meletakkan objek CORBA pada mesin yang berbeza. Setiap objek jauh menyelesaikan subtugas tertentu, dengan itu melegakan pelanggan daripada kerja yang tidak perlu.

Teras CORBA ialah Broker Permintaan Objek. ORB menguruskan interaksi objek dalam persekitaran rangkaian teragih. IIOP (Internet Inter-ORB Protocol) ialah protokol khas untuk interaksi antara ORB.

Objek khas yang dipanggil stub beroperasi dalam ruang alamat pelanggan. Setelah menerima permintaan daripada pelanggan, ia membungkus parameter permintaan ke dalam format khas dan menghantarnya ke pelayan, atau sebaliknya ke rangka.

Skeleton ialah objek yang beroperasi dalam ruang alamat pelayan. Setelah menerima permintaan daripada pelanggan, ia membongkarnya dan menghantarnya ke pelayan. Rangka juga menukar respons pelayan dan menghantarnya kepada klien (stub).

Untuk menulis sebarang aplikasi CORBA menggunakan teknologi Java, anda perlu mempunyai dua perkara - pakej JDK1.5 dipasang dan pengkompil idlj (…\ jdk 1.5.0\ tong sampah\ idlj. exe). JDK menyediakan satu set kelas untuk bekerja dengan objek CORBA, dan idlj memetakan bahasa IDL ke Java.

6 .1 Mencipta aplikasi CORBA yang mudah

      1. Menulis antara muka

Ciptaan CORBA aplikasi pada Jawabermula dengan menulis antara muka untuk objek jauh menggunakan bahasa penerangan antara muka (Antara mukaDefinisiBahasa, IDL).

Jom buatfailhello.idl

modul HelloApp

antara muka Hello

rentetan sayHello();

penutupan batal sehala();

Antara muka ini menerangkan hanya dua kaedahmenutup Dan katakan hai . Lebih-lebih lagi, tidak penting bagi kami apa kaedah ini lakukan, perkara utama ialah kami menentukan ia wujud dan menentukan parameter input dan output yang mereka ada.

Seterusnya anda harus menjalankan pengkompilIDL- kepada- Jawaidlj:

idlj – jatuhHello. terbiar

Folder baharu telah muncul dalam direktori semasaHello Aplikasi , yang mengandungi enam fail java. Setiap daripada mereka mempunyai tujuan tersendiri.

    HelloPOA. javajava– kelas abstrak yang tidak lebih daripada rangka pelayan (rangka) dan menyediakan fungsi pelayan.

    _ HelloStub. java– kelas yang melaksanakan rintisan ( rintisan) pelanggan. Menyediakankefungsian klien.

    HelloHelper. java Dan HelloHolder. java– kelas yang menyediakan fungsi pembantu untukCORBA objek.

    HelloOperations. java– kelas yang mengandungi penerangan tentang antara mukahello dalam bahasa Jawa.

    Hello. java– kelas – warisHelloOperations, antara muka sokonganorg. Oh Tuhan. CORBA. Objek.

      1. Mencipta pelayan

Sekarang tugas kita ialah menulis kelas yang melaksanakan antara mukahello . Dalam kes kami ia akan menjadiHelloImpl . Sila ambil perhatian bahawa ia adalah keturunan kelasHelloPOA . DALAM HelloImpl kaedah yang diisytiharkan dalamHello . terbiar .

Untuk memudahkan tugas, pengisytiharan kaedah boleh diambil dari fail HelloOperations . java , dihasilkan jdlj .

bola ORB persendirian;

orb = orb_val;

awam String sayHello() (

kembalikan "\nHello world!!\n";

penutupan kekosongan awam() (

orb.shutdown(false);

Langkah seterusnya ialah mencipta yang sebenarbahagian pelayan aplikasi. Ini akan menjadi kelasHelloServer.

Ia hanya akan mempunyai satu kaedah - fungsi standardutama.

Perkara pertama yang kita lakukan ialah mencipta ORB. Kemudian kami membuat contoh kelas objek jauh (HelloImpl) dan daftarkannya dalam ORB. Seterusnya, kami memanggil perkhidmatan nama khas (NameService) dan mendaftarkan nama objek jauh di dalamnya supaya pelanggan dapat mencarinya.

Mari kita lihat lebih dekat pada peringkat ini.

1. Penciptaan dan permulaan ORB. Dihasilkan dengan memanggil kaedah statikdi dalamnya kelas ORB

2. Mencipta contoh kelas objek jauh dan mendaftarkannya dalam ORB

helloImpl.setORB(orb);

3. Mendapatkan konteks penamaan (NamingContext)

org.omg.CORBA. Objek objRef =

Dalam baris pertama kita mendapat rujukan objek kepada perkhidmatan nama (NameService). Tetapi sebenarnya ini adalah objek CORBA biasa dan untuk menggunakannya sebagai konteks penamaan (NamingContext), anda perlu memanggil kaedahsempit kelas PenamaanContextHelper , yang nampaknya menentukan objek CORBA ini.

4. Mendaftarkan nama objek jauh (HelloImpl)

Nama rentetan = "Hello";

ncRef. ikat semula (laluan, href);

Nama didaftarkan supaya pelanggan dapat mencari objek jauh. Tujuan ini dilaksanakan oleh fungsiikat semula (NamaKomponennc, Objekobj) antara muka PenamaanKonteks.

5. Menunggu permintaan daripada pelanggan

orb. lari();

Pelayan kini sedia untuk digunakan.

// HelloServer.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg.CORBA.*;

import org.omg. PortableServer.*;

import org.omg. PortableServer.POA;

import java.util. Hartanah;

kelas HelloImpl memanjangkan HelloPOA (

bola ORB persendirian;

public void setORB(ORB orb_val) (

orb = orb_val;

// laksanakan kaedah sayHello().

awam String sayHello() (

kembalikan "\nHello world!!\n";

// melaksanakan kaedah shutdown().

penutupan kekosongan awam() (

orb.shutdown(false);

kelas awam HelloServer(

utama kekosongan statik awam (String args) (

cuba (

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

// dapatkan rujukan kepada rootpoa & aktifkan POAManager

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

rootpoa.the_POAManager().activate();

// buat pelayan dan daftarkannya dengan ORB

HelloImpl helloImpl = HelloImpl();

helloImpl.setORB(orb);

// dapatkan rujukan objek daripada hamba

org.omg.CORBA. Objek ref = rootpoa.servant_to_reference(helloImpl);

Hello href = HelloHelper.narrow(ref);

// NameService menggunakan perkhidmatan nama

orb.resolve_initial_references("NameService");

// Gunakan NamingContextExt yang merupakan sebahagian daripada Interoperable

// Spesifikasi Perkhidmatan Penamaan (INS).

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// mengikat Rujukan Objek dalam Penamaan

Nama rentetan = "Hello";

Laluan NameComponent = ncRef.to_name(name);

ncRef.rebind(path, href);

System.out.println("HelloServer sedia dan menunggu...");

// tunggu permohonan daripada pelanggan

orb.run();

tangkapan (Pengecualian e) (

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

System.out.println("HelloServer Keluar...");

      1. Mencipta pelanggan

Mari kita beralih kepada menulis kod untuk pelanggan.

Langkah asas untuk menulis aplikasi klien

    Penciptaan dan Permulaan ORB

    Mendapatkan konteks perkhidmatan nama (PenamaanKonteks)

    Mencari objek jauh

    Memanggil kaedah sayHello.

    Memanggil kaedah penutupan.

Seperti yang anda lihat, dua mata pertama bertepatan dengan peringkat mencipta aplikasi pelayan, jadi kami tidak akan mempertimbangkannya.

Perkara ketiga juga agak mudah untuk dilaksanakan. Objek diciptaNamaKomponen. Kaedahnya dipanggilazam (NamaKomponenlaluan), yang mencari objek jauh mengikut nama (standardCORBAsebuah objek). Menggunakan kaedahsempit (org. Oh Tuhan. CORBA. Objekobj) kelas helloHelper(dijanaidljpengkompil) kami mendapat rujukan objek kepada antara mukahello.

Nama rentetan = "Hello";

Sekarang anda boleh memanggil kaedahkatakan hai:

Kaedahmenutupmematikan pelayan.

helloImpl.shutdown();

//testClient.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg. CosNaming. PenamaanContextPackage.*;

import org.omg.CORBA.*;

HelloClient kelas awam

{

statik Hello helloImpl;

utama kekosongan statik awam (String args)

{

cuba (

// buat dan mulakan ORB

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

// dapatkan konteks penamaan akar

org.omg.CORBA. Objek objRef =

orb.resolve_initial_references("NameService");

// Gunakan NamingContextExt dan bukannya NamingContext. Ini adalah

// sebahagian daripada Perkhidmatan penamaan Interoperable.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// menyelesaikan Rujukan Objek dalam Penamaan

Nama rentetan = "Hello";

helloImpl = HelloHelper.narrow(ncRef.resolve_str(nama));

System.out.println("Mendapat pemegang pada objek pelayan:" + helloImpl);

System.out.println(helloImpl.sayHello());

helloImpl.shutdown();

) tangkapan (Pengecualian e) (

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

e.printStackTrace(System.out);

}

}

}

      1. Kompilasi Dan pelancaran aplikasi

FailHelloServer. java dan HelloClient. java, Hello. terbiardan folderHelloApp, diciptaidkj. exemesti disimpan dalam satu folder.

Untuk menyusun klien dan pelayan yang anda perlukan baris arahan dail

javac *.java HelloApp/*.java

javac. exeadalah dalam …\jdk1.5.0\ tong sampah.

RabuGerhanatidak membenarkan berjalanCORBAaplikasi. Untuk permulaan

1. Mulakan perkhidmatanorbdObjek Permintaan Broker Daemon (…\ jdk1.5.0\ tong sampah\ orbd. exe). Ini dilakukan supaya kita boleh mendapatkan pautan ke perkhidmatan nama.

mulakan orbdORBInitialPort 1050

Parameter -ORBInitialPort– nombor port di mana pelayan nama akan beroperasi.

2. Pelancaran pelayan

pelayan nama.

3. Pelancaran pelanggan

Menentukan port di mana pelayan nama sedang berjalan. Parameter – ORBInitialHost menentukan hos tempat ia dijalankanpelayan nama.

Untuk memudahkan penyusunan dan pelancaran, anda boleh membuatkelawarfail:

idlj – jatuh Hello.idl

javac *.java HelloApp/*.java

mulakan java HelloServer – ORBInitialPort 1050 – ORBInitialHost localhost

java HelloClient – ​​ORBInitialPort 1050 – ORBInitialHost localhost


6.2 Bahasa IDL

BahasaOh Tuhan IDL (Antara muka Definisi Bahasa– Bahasa Penerangan Antara Muka) ialah sintaks bebas teknologi untuk menerangkan antara muka objek. Apabila menerangkan seni bina perisian,Oh Tuhan IDLdigunakan dengan baik sebagai tatatanda sejagat untuk mentakrifkan sempadan objek yang menentukan kelakuannya berhubung dengan komponen lain sistem maklumat.Oh Tuhan IDLmembolehkan anda menerangkan antara muka yang mempunyai kaedah dan atribut yang berbeza. Bahasa ini juga menyokong warisan antara muka, yang diperlukan untuk guna semula objek dengan kemungkinan pengembangan atau spesifikasinya.

IDLialah bahasa deklaratif semata-mata, iaitu, ia tidak mengandungi sebarang pelaksanaan.IDLspesifikasi boleh disusun (dipetakan) ke dalam fail pengepala dan prototaip pelayan khas yang boleh digunakan secara langsung oleh pengaturcara. Itu diaIDLkaedah tertentu boleh ditulis, dan kemudian dilaksanakan, dalam mana-mana bahasa yang mana pemetaan wujudIDL. Bahasa sedemikian termasukC, C++, SmallTalk, Pascal, Jawa, Ada.

Dengan menggunakanIDLAnda boleh menerangkan sifat-sifat komponen, dan kelas induk yang diwarisinya, dan pengecualian yang dilemparkan, dan, akhirnya, kaedah yang mentakrifkan antara muka, dengan penerangan tentang parameter input dan output.

StrukturCORBA IDLfail kelihatan seperti ini:

modul(

;

;

;

antara muka [: ] (

;

;

;

;

()

.

.

()

.

.

}

antara muka [: ]

.

.

}

Sintaks bahasaIDLagak besar dan tidak mungkin untuk menerangkannya dalam manual pengajaran.

Untuk melaksanakan antara muka pelayan mel, anda boleh menambahHello. terbiar

modul HelloApp

{

struct TMessage

{

rentetan Kepada;

rentetan Daripada;

rentetan Mesej;

};

TMessages jujukan typedef;

antara muka Hello

{

TMessages GetMessages (dalam nama rentetan, keluar kiraan pendek);

oneway void Hantar (dalam rentetan Pelanggan, dalam rentetan Nama, dalam rentetan Mesej);

rentetan sayHello();

penutupan batal sehala();

};

};

TMessages jujukan typedef; pengumuman menaip dinamik tatasusunan mesejTMessage.

CORBA (Seni Bina Broker Permintaan Objek Biasa)- teknologi berorientasikan objek untuk mencipta aplikasi yang diedarkan. Teknologi adalah berdasarkan penggunaan Broker Permintaan Objek (ORB) untuk menghantar dan menerima permintaan secara telus oleh objek dalam persekitaran yang diedarkan. Teknologi ini membolehkan anda membina aplikasi daripada objek yang diedarkan yang dilaksanakan dalam pelbagai bahasa pengaturcaraan. Standard CORBA dibangunkan Kumpulan Pengurusan Objek (OMG).

seni bina CORBA

DALAM bahagian ini diberikan ulasan ringkas CORBA seperti yang diterangkan dalam spesifikasi Oh Tuhan versi 3.0. Keperluan dokumen ini mungkin dipenuhi pada tahap yang berbeza-beza mengikut pelaksanaan sebenar. broker permintaan objek. Dalam Rajah. Rajah 2.1 menggambarkan permintaan yang dihantar oleh klien kepada pelaksanaan objek. Pelanggan ialah entiti yang ingin melakukan operasi pada objek, dan Perlaksanaan ialah koleksi kod dan data yang sebenarnya melaksanakan objek.

ORB bertanggungjawab untuk semua mekanisme yang diperlukan untuk mencari pelaksanaan yang sesuai bagi objek untuk permintaan, menyediakan pelaksanaan untuk menerima permintaan, dan pemindahan data sedang berjalan memenuhi permintaan. Antara muka yang boleh dilihat oleh pelanggan adalah bebas sepenuhnya daripada lokasi pelaksanaan objek, bahasa pengaturcaraan di mana ia ditulis, dan sebarang aspek lain yang tidak ditunjukkan dalam spesifikasi antara muka.

Antara muka panggilan dinamik dan antara muka rintisan mempunyai semantik yang sama, supaya penerima mesej tidak dapat menentukan cara permintaan dihantar. ORB mencari kod pelaksanaan objek yang sesuai, menghantar parameter kepadanya dan memberikan kawalan melalui IDL rangka atau rangka dinamik (Rajah 2.4). Rangka adalah khusus untuk antara muka dan penyesuai objek tertentu. Semasa pelaksanaan pertanyaan, pelaksanaan mungkin menggunakan beberapa perkhidmatan ORB melalui penyesuai objek. Apabila permintaan selesai, nilai kawalan dan hasil dikembalikan kepada pelanggan.

Pelaksanaan objek boleh memilih penyesuai objek yang hendak digunakan bergantung pada perkhidmatan yang diperlukannya. Dalam Rajah. Rajah 2.5 menunjukkan cara antara muka dan maklumat pelaksanaan disediakan kepada pelanggan dan pelaksanaan objek. Antara muka diterangkan dalam IDL atau menggunakan repositori antara muka. Penerangan mereka digunakan untuk menjana stub pelanggan dan rangka untuk pelaksanaan.

Maklumat tentang pelaksanaan objek disediakan semasa pemasangan dan disimpan dalam repositori pelaksanaan, dan kemudian digunakan semasa proses penghantaran permintaan.

Alexander Godin

Teknologi CORBA ialah piawaian untuk menulis aplikasi teragih yang dicadangkan oleh konsortium OMG (Open Management Group). Dengan mencipta objek CORBA, kita boleh, sebagai contoh, mengurangkan dengan ketara masa yang diperlukan untuk menyelesaikan masalah yang memerlukan jumlah pengiraan yang besar. Ini boleh dilakukan dengan meletakkan objek CORBA pada mesin yang berbeza. Setiap objek jauh menyelesaikan subtugas tertentu, dengan itu melegakan pelanggan daripada kerja yang tidak perlu.

Mari kita lihat interaksi objek dalam seni bina CORBA

Rajah 1 Interaksi objek dalam seni bina CORBA

Teras CORBA ialah Broker Permintaan Objek. ORB menguruskan interaksi objek dalam persekitaran rangkaian teragih. IIOP (Internet Inter-ORB Protocol) ialah protokol khas untuk interaksi antara ORB.

Objek khas yang dipanggil stub beroperasi dalam ruang alamat pelanggan. Setelah menerima permintaan daripada pelanggan, ia membungkus parameter permintaan ke dalam format khas dan menghantarnya ke pelayan, atau lebih tepatnya ke rangka.

Skeleton ialah objek yang beroperasi dalam ruang alamat pelayan. Setelah menerima permintaan daripada pelanggan, ia membongkarnya dan menghantarnya ke pelayan. Rangka juga menukar respons pelayan dan menghantarnya kepada klien (stub).

Untuk menulis sebarang aplikasi CORBA menggunakan teknologi Java, anda perlu mempunyai dua perkara - pakej JDK1.2 dipasang dan pengkompil idltojava. JDK menyediakan satu set kelas untuk bekerja dengan objek CORBA, dan idltojava memetakan bahasa IDL ke Java.

Mencipta aplikasi CORBA dalam Java bermula dengan menulis antara muka untuk objek jauh menggunakan Bahasa Definisi Antara Muka (IDL).

Mari buat fail test.idl modul testApp ( ujian antara muka ( kiraan panjang (dalam mesej rentetan); ); );

Antara muka ini menerangkan hanya satu kaedah mengira. Lebih-lebih lagi, tidak penting bagi kami apa kaedah ini lakukan, perkara utama ialah kami menentukan bahawa ia wujud, kami menentukan parameter input dan output yang ada.

Mari gunakan pengkompil idltojava.

Idltojava Hello.idl Catatan. Pengkompil ini menggunakan prapemproses bahasa C++ secara lalai, jadi ia tidak perlu berurusan dengan mesej ralat Perintah atau nama fail tidak betul(laluan ke sana mesti ditentukan dalam pembolehubah persekitaran CPP) lumpuhkan penggunaannya dengan menetapkan bendera. idltojava -fno-cpp Hello.idl Hasil program ini boleh diwakili dalam bentuk rajah.

Rajah.2 Pengendalian pengkompil idltojava
Folder baharu telah muncul dalam direktori semasa testApp, yang mengandungi lima fail java. Setiap daripada mereka mempunyai tujuan tersendiri.

_testImplBase.java - kelas abstrak yang tidak lebih daripada rangka pelayan (rangka) dan menyediakan fungsi pelayan;

_testStub.java - kelas yang melaksanakan stub pelanggan. Menyediakan fungsi pelanggan;

test.java - kelas yang mengandungi penerangan tentang antara muka ujian dalam Java;

testHelper.java Dan testHolder.java - kelas yang menyediakan fungsi utiliti untuk objek CORBA.

Sekarang tugas kita ialah menulis kelas yang melaksanakan antara muka ujian. Kelas sedemikian harus dinamakan supaya nama mereka mengandungi perkataan "Hamba", dalam kes kami ia akan menjadi testServant.

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

Sila ambil perhatian bahawa kelas ini diwarisi daripada _testImplBase. Seperti yang anda lihat, kaedah kiraan dilaksanakan di sini, yang dalam dalam contoh ini Mengira bilangan huruf dalam mesej yang diterima.

Sekarang mari kita beralih kepada menulis bahagian pelayan aplikasi.

Perkara pertama yang kita lakukan ialah mencipta ORB. Kemudian kami mencipta contoh kelas objek jauh (testServant) dan mendaftarkannya dalam ORB. Seterusnya, kami memanggil perkhidmatan nama khas (NameService) dan mendaftarkan nama objek jauh di dalamnya supaya pelanggan dapat mencarinya (ada cara lain untuk mencari objek jauh, tetapi lebih lanjut mengenainya kemudian).

Mari kita lihat lebih dekat pada peringkat ini.

  1. Penciptaan dan permulaan ORB. Dihasilkan dengan memanggil kaedah statik di dalamnya kelas ORB

    ORB orb = ORB.init();

  2. Mencipta contoh kelas objek jauh dan mendaftarkannya dalam ORB

    testServant testRef = new testServant();

    orb.connect(testRef);

  3. Mendapatkan konteks penamaan (NamingContext)

    org.omg.CORBA.Object objRef =

    orb.resolve_initial_references("NameService");

    NamingContext ncRef = NamingContextHelper.narrow(objRef);

    dalam baris pertama kita mendapat rujukan objek kepada perkhidmatan nama (NameService). Tetapi sebenarnya ini adalah objek CORBA biasa dan untuk menggunakannya sebagai konteks penamaan (NamingContext), anda perlu memanggil kaedah sempit kelas PenamaanContextHelper, yang nampaknya menentukan objek CORBA ini.

  4. Mendaftarkan nama objek jauh (testServant)

    Seperti yang dinyatakan sebelum ini, pendaftaran nama dilakukan supaya pelanggan dapat mencari objek jauh. Tujuan ini dilaksanakan oleh fungsi rebind(NameComponent nc, Objek obj) antara muka PenamaanKonteks.

    NameComponent nc = new NameComponent("test", ""); //parameter pertama //menunjukkan nama objek, //kita tidak perlu menggunakan laluan NameComponent yang kedua = (nc); ncRef.rebind(path, testRef);

  5. Menunggu permintaan daripada pelanggan. java.lang.Object sync = new java.lang.Object(); disegerakkan (sync) ( sync.wait(); )

    Selepas pelayan memproses permintaan daripada klien dan melaksanakan kaedah tersebut mengira ia akan berada dalam keadaan siap sedia semula.

Pelayan kini sedia untuk digunakan

Penyenaraian 1. testServer.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.lang.*; class testServant memanjangkan _testImplBase ( public int count(String msg) ( return msg.length(); ) ) public class testServer ( public static void main(String args) ( try ( ORB orb = ORB.init(args, null); testServant testRef = new testServant(); orb.connect(testRef);org.omg.CORBA.Object objRef = orb.resolve_initial_references("NamingContextHelper.narrow(objRef); ); ncRef.rebind(path, testRef); java.lang.Object sync = new java.lang.Object(); ("RALAT: " + e); e.printStackTrace(System.out);

Sila ambil perhatian bahawa semua operasi yang dilakukan pada objek CORBA terkandung dalam blok cuba-tangkap.

Mari kita beralih kepada menulis kod untuk pelanggan.

Langkah asas untuk menulis aplikasi klien

  1. Penciptaan dan Permulaan ORB
  2. Mendapatkan konteks perkhidmatan nama ( PenamaanKonteks)
  3. Mencari objek jauh
  4. Memanggil Kaedah mengira.

Seperti yang anda lihat, dua mata pertama bertepatan dengan peringkat mencipta aplikasi pelayan, jadi kami tidak akan mempertimbangkannya.

Perkara ketiga juga agak mudah untuk dilaksanakan. Objek dicipta NamaKomponen. Kaedahnya dipanggil menyelesaikan (NameComponent laluan), yang mencari objek jauh (objek CORBA standard) mengikut nama. Menggunakan kaedah sempit(org.omg.CORBA.Object obj) kelas testHelper(dijana idltojava pengkompil) kami mendapat rujukan objek kepada antara muka ujian.

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

Sekarang anda boleh memanggil kaedah mengira

String msg = "cuba kira"; int count = testRef.count(msg);

Penyenaraian 2. testClient.java

Import testApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; import java.lang.*; testClient kelas awam ( public static void main(String args) ( cuba ( ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper. narrow(objRef);NamaKomponen nc = new NameComponent("test", ""); "bilangan aksara dalam mesej ialah:" + count ) catch (Exception e) ( System.out.println("ERROR: " + e) ​​​​; e.printStackTrace(System.out);

Melancarkan aplikasi

  1. Memulakan pelayan nama (disertakan dengan JDK1.2). Ini dilakukan supaya kita boleh mendapatkan pautan ke perkhidmatan nama tnameserv

    secara lalai pelayan bermula pada port 900. Nilai ini boleh ditukar dengan menentukan parameter pelancaran -ORBInitialPort, contohnya

    Tnameserv -ORBinitialPort 1024

  2. Memulakan pelayan testServer java testServer -ORBInitialPort 1024 // menunjukkan port // di mana pelayan nama beroperasi
  3. Melancarkan pelanggan testClient java testClient -ORBInitialHost javas.stu.neva.ru -ORBInitialPort 1024

    parameter -ORBInitialHost menentukan hos di mana ia dijalankan testServer

selepas melaksanakan aplikasi ini, konsol akan dipaparkan

Bilangan aksara dalam mesej ialah:12

Menyambung ke pelayan tanpa menggunakan perkhidmatan nama

Idea asas kaedah ini ialah pelayan menyimpan contoh kelas objek jauh ( testServant) sebagai fail teks di mana-mana, boleh diakses oleh pelanggan. Pelanggan memuatkan data daripada fail (ke dalam objek Tali) dan menukar menggunakan kaedah khas kepada rujukan objek kepada objek jauh.

Semua ini dilaksanakan seperti berikut

Mari kita keluarkan sebahagian daripada kod - ini juga terpakai kepada klien ( testServer.java Dan testClient.java)

  1. Mari kecualikan org.omg.CosNaming.* daripada pustaka import. org.omg.CosNaming.NamingContextPackage.*;
  2. Mari padamkan kod yang sepadan dengan langkah 3-item 4
Daripada kod jauh, kami akan memasukkan - untuk pelayan: //menukar objek kepada rentetan String ior = orb.object_to_string(testRef); Nama fail rentetan = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; //buat fail test_file FileOutputStream fos = new FileOutputStream(nama fail); PrintStream ps = PrintStream(fos); //tulis data padanya ps.print(ior); ps.close();

untuk pelanggan:

Nama fail rentetan = System.getProperty("user.home") + System.getProperty("file.separator")+"test_file"; //buka fail FileInputStream fis = new FileInputStream(nama fail); DataInputStream dis = new DataInputStream(fis); //read data String ior = dis.readLine(); //tukar kepada objek CORBA org.omg.CORBA.Object obj = orb.string_to_object(ior); //dapatkan rujukan kepada ujian objek jauh testRef = testHelper.narrow(obj);

Mari kita susun aplikasi, lancarkan pelayan dan klien dengan cara yang sama seperti yang kita lakukan sebelum ini (jalankan pelayan nama dalam dalam kes ini Tidak perlu).