Технология CORBA
Лабораторная работа: Технология CORBA Пример 1. Тестирование CORBA-соединения клиента с сервером Рассмотрим создание примитивной клиент/серверной ИС, состоящей из: · CORBA-сервера, приветствующего обратившегося к нему CORBA-клиента; · CORBA-клиента, способного подключаться к CORBA-серверу. Построение CORBA-сервера Для построения CORBA-сервера нужно запустить мастера CORBA Server командой File | New | Other | Multitier | CORBA Server (рис. 1). Рисунок 1 Когда мастер создания сервера запущен, он ожидает от программиста некоторой дополнительной информации (рис. 2): 1. Какого рода CORBA-сервер следует создать: консольное приложение (опция Console Application) или оконное (Window Application)? Не лишне напомнить, что сервер CORBA - это программа, производящая экземпляры объектов и уведомляющая об этом все заинтересованные программы-клиенты. Рисунок 2 2. Имена IDL-файлов с описанием интерфейсов объектов (кнопка Add) либо, если отметить кнопку Add New IDL File, мастер сам создаст пустой IDL-файл и добавит его в проект. После нажатия кнопки OK генерируется новый проект, и в окне редактора открывается пустой IDL-файл. Следующим действием разработчика будет описание интерфейса объекта калькулятора на языке IDL (рис. 5.3). Рисунок 3 Сохраним полученное описание в файле с именем User.idl. Теперь можно создать интерфейс пользователя, как показано на рис. 4. Рисунок 4 В элемент управления Memo1 будет заноситься строка приветствия подключившегося к CORBA-серверу клиента. Сохраним проект под именем CORBAServerProject. Для создания импортируемого сервером объекта выполним команду File | New | Other | Multitier | CORBA Object Implementation для запуска соответствующего мастера (рис. 5). Рисунок 5 Запущенный мастер собирает необходимую для генерации кода информацию (название файла описания объекта на IDL и имя реализуемого интерфейса) и отбражает на экране диалоговое окно (рис. 5.6). . Рисунок 6 В поле Interface Name следует выбрать из выпадающего списка имя интерфейса User::Welcome; это приведет к автоматическому заполнению имени класса объекта и модуля, которые будут сгенерированы мастером CORBA Object Implementation. Имя самого объекта WelcomeObject проставляется в поле Object Names. В самом низу диалоговой панели в левой ее стороне находится кнопка Show Updates. Со включенной кнопкой Show Updates программист получает возможность видеть все изменения в проекте, происходящие при генерации новых файлов и автоматической модификации уже имеющихся исходных текстов. После нажатия на кнопку Ok появляется окно (рис. 7), в котором слева отображается список всех произошедших во время работы мастера действий, тогда как в правой панели находятся исходные тексты, являющиеся результатом подобных действий. Рисунок 7Эта панель - полноценный редактор, в котором можно тут же внести изменения. Если то или иное действие мастера программиста не устраивает, он может просто отключить кнопку напротив его названия в левой панели. И действие будет отменено. Создавая калькулятор, нужно найти действие с именем WelcomeImpl::Hello (в левой панели), переключиться на него и внутрь пока еще пустого (в правой панели) метода Hello внести код приветствия. Заметим, что для успешной компиляции этого кода в модуль нужно добавить заголовочный файл формы #include "CORBAServerUnit.h", а ссылку extern TForm1 *Form1;.Осталось построить проект (рис. 8). Рисунок 8CORBAServerProject.cpp#include <vcl.h>#pragma hdrstop//---------------------------------------------------------------------------#include "WelcomeServer.h"#include <corba.h>USEFORM("CORBAServerUnit.cpp", Form1);//---------------------------------------------------------------------------WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){try{Application->Initialize();// Initialize the ORB and BOACORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv);CORBA::BOA_var boa = orb->BOA_init(__argc, __argv);WelcomeImpl welcome_WelcomeObject("WelcomeObject");boa->obj_is_ready(&welcome_WelcomeObject);Application->CreateForm(__classid(TForm1), &Form1);Application->Run();}catch (Exception &exception){Application->ShowException(&exception);}catch (...){try{throw Exception("");}catch (Exception &exception){Application->ShowException(&exception);}}return 0;}WelcomeServer.cpp #pragma hdrstop #include <corba.h> #include "WelcomeServer.h" #include "CORBAServerUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) extern TForm1 *Form1; WelcomeImpl::WelcomeImpl(const char *object_name): _sk_User::_sk_Welcome(object_name) { } void WelcomeImpl::Hello() { Form1->Memo1->Lines->Add ("Hello, client!"); } Интересной особенностью CORBA-мастеров C++ Builder является их умение синхронизировать изменения в описании объектной модели с генерируемыми исходными текстами. Каждый раз, когда программист модифицирует IDL-файл, среда разработки исправляет заглушки (stubs) и скелеты (skeletons) приложения, а также переделывает объект. Построение CORBA-клиента Действия, необходимые для проектирования клиентского приложения, обращающегося к серверу, также не сложны. Для построения CORBA-клиента нужно запустить мастера CORBA Client командой File | New | Other | Multitier | CORBA Server (рис. 5.9).
Рисунок 9 В появившемся диалоговом окне (рис. 5.10) нужно выбрать тип приложения и ввести имя IDL-файла user.idl, описывающего объект, к которому будет обращаться CORBA-клиент (можно и не указывать этого имени, а просто добавить IDL-файл в проект). Рисунок 10 Далее нужно спроектировать несложный интерфейс пользователя, позволяющий соединяться с CORBA-сервером (рис. 11). Рисунок 11 #include <vcl.h> #pragma hdrstop #include "CORBAClientUnit.h" #include "user_c.hh" // !!! //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { User::Welcome_var H = User::Welcome::_bind("WelcomeObject"); H->Hello(); } В обработчике нажатия на кнопку «Подключение к CORBA-серверу» помещают исходный текст, производящий вызов метода Hello() удаленного объекта WelcomeObject интерфейса Welcome модуля User. Тестирование ИС Для тестирования ИС следует активизировать утилиту Smart Agent из меню Tools (это программа c:\Inprise\vbroker\bin\osagent.exe) (рис. 12). Рисунок 12 и последовательно (вне среды C++ Builder) запустить CORBA-сервер и CORBA-клиент Пример 2. Создание многоуровневой ИС Рассмотрим пример создания многоуровневой ИС, в которой клиент из банкомата может обратиться к серверу банка и выполнить нужные ему операции (рис. 15). Рисунок 15Для ускорения обработки данных серверы банков реализованы в разных каналах. Пример следует рассмотреть самостоятельно, руководствуясь комментариями к нижеприведенному коду программы. Xaction.idl enum EnumAction { balance, withdraw, deposit }; enum EnumStatus { OK, invalid, complete, incomplete }; struct xaction { long UserID; long PIN; long account; double amount; ::EnumAction action; double balance; ::EnumStatus status; }; interface Server { exception NoServer { string message; }; ::xaction HandleTransaction( inout ::xaction Transaction ); /* raises( ::Server::NoServer ); */ long Balance(); }; banking.idl #include "xaction.idl" interface BankServer { ::xaction HandleTransaction( inout ::xaction Transaction ); long BankID(); }; module Bank { interface Account { float balance(); }; interface AccountManager { ::Bank::Account open( in string name ); };
Страницы: 1, 2, 3, 4
|