На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Пример создания сервера и клиента CORBA , статья,Delphi 7
      Пример создания сервера и клиента CORBA

      В прежних версиях Delphi поддержка технологии CORBA была тесно объединена с поддержкой технологии COM (на уровне визуальных средств формирования интерфейсов). Это, в частности, выражалось в использовании редактора библиотеки типов, применявшегося преимущественно при описании интерфейсов для COM – объектов.
      В Delphi 7 включен специальный компилятор IDL2PAS, автоматически генерирующий исходные тексты серверного и клиентского приложения на Паскале на основе описания интерфейса, заданного на языке IDL. Такой подход хорошо тем, что опираться на платформно - независимый язык IDL и даёт возможность создавать распределённые COBRA – приложения на основе шаблонов, подготовленных для других операционных систем.
      ЗАМЕЧАНИЕ При использование компилятора IDL2PAS в приложении будут использованы новые модули corba.pas и orbpas30.pas/orbpas40.pas вместо старых corbaobj.pas и orbpas.pas .
      Серверный CORBA – модуль

      Рассмотрим пример создания CORBA – системы с применением новых возможностей Delphi 7. Эта система реализует функцию сложения двух чисел:
      ExpandedWrap disabled
        Function AddNmb(const X:Integer; const Y:Integer):Integer;
      Прежде всего необходимо подготовить исходный файл server.idl, содержащий описание нужного нам интерфейса. Для этого необходимо знание языка IDL – он во многом напоминает язык Си . Вместе с тем его основные элементы настолько прозрачны, что понимание структуры простейшего интерфейса не составит труда.

      Назовём IDL – модуль Server и опишем в нём два интерфейса: IMyTest и MyTestFactory.
      Первый, основной интерфейс, MyTestFactory, нужен для автоматического создания копии соответствующего объекта при обращении к публикуемому интерфейсу. Этот интерфейс сохраним в файл server.idl
      ExpandedWrap disabled
        Module Server
         {
        interface IMyTest;
         
        interface IMyTest
         {
           long AddNmb (in long X, in long Y);
        };
        interface MyTestFactory
         {
         IMyTest Createinstance (in string InstanceName);
           };
        };
      Для создания CORBA – сервера надо дать команду File -> New -> Other и на закладке CORBA выбрать значок CORBA Server Application. Появится диалоговое окно, вызывающее компилятор IDL2PAS.
      Этот компилятор можно также вызвать командой Tools -> Regenerate CORBA IDL files (Инструменты -> Перегенерировать CORBA IDL - файлы).

      Следующий шаг – генерация на основе описанного выше интерфейса прикладных модулей Delphi, реализующих соответствующую функциональность. Кнопкой Add в диалоговом окне выбирается соответствующий IDL –файл(server.idl), описывающий наш интерфейс, а с помощью переключателей Application Type можно указать вид создаваемого приложения: консольное или Windows(выберем вариант Windows).На вкладке Options задаются дополнительные параметры генерации исходных текстов. Желательно, чтобы были установлены флажки Generate Skeleton Units и Generate Implementation Units, которые соответственно означают Генерировать шаблоны модулей и Генерировать модули реализации интерфейса.

      После нажатия кнопки OK будут сгенерированы четыре файла на Паскале, названия которых совпадают с названием модуля IDK – файла, описывающего наш интерфейс (Server). Дополнения к названиям полученных файлов (они расположатся в одном каталоге с server.idl) означают следующее:
      • I – модуль реализации интерфейса;
      • S – модуль реализации шаблона интерфейса;
      • C – модуль реализации класса;
      • Impl – модуль, реализующий функциональность интерфейса.
      В файле server_impl.pas надо указать, что делает единственный описанный в интерфейсе метод AddNmb:
      ExpandedWrap disabled
         Function TIMyTest.AddNmb(const X:integer; const Y:Integer):Integer;
         Begin
           Result :=X+Y;
         End;
      Автоматически подготовленная процедура InitCorba этого модуля выполняет инициализацию и связь с CORBA – системой, а также создаёт о формирует соответствующий серверный интерфейс. Вызывается она в момент создания формы сервера.
      В нашем случае текст модуля будет выглядеть так :
      ExpandedWrap disabled
        Unit Unit1;
         Interface uses
         Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Corba, Server_c, Server_i, Server_s, Server_impl;
         Type
         TForm1 – class(TForm)
         Procedure FormCreate(Sender: TObject);
        Private
        {private declarations}
        Protected
        { Protected declarations }
         MTest: IMyTest; // skeleton object
        Procedure InitCorba;
        Public
        {public declarations }
        end;
        var Form1 : TForm1;
        implementation
        {$R *.DFM}
        Procedure TForm1.InitCorba;
        Begin
         CorbaInitialize;
        MTest := TIMyTestSkeleton.Create(‘Corba MyTest’,TIMyTest.Create);
        BOA.ObjIsReady(MTest as _Object);
        End;
        Procedure TForm1.FormCreate(Sender: TObject);
        Begin
         InitCorba;
        End;
        End.

      Данные приложения можно откомпилировать и запустить. Оно будет представлять собой полноценный CORBA – сервер, реализующий интерфейс IMyTest.

      Создание клиентского CORBA – приложения

      Дадим команду File -> New - > Other, на панели CORBA выберем значок CORBAA Client Application. Снова, как и в прошлый раз, с помощью кнопки Add добавим соответствующий IDL – файл с описанием нужного интерфейса и нажмём кнопку OK. Будет автоматически сгенерирован клиентский CORBA – модуль, в котором потребуется дополнительно описать переменную:
      ExpandedWrap disabled
         vIMyTest : IMyTest;
      В момент создания формы эта переменная послужит интерфейсом CORBA – серверу. Такая связь выполняется с помощью метода bind класса TIMyTestHelper. Теперь к этому интерфейсу можно обращаться из других частей программы, например при нажатии кнопки Button1. Полный текст данного модуля запишется так:
      ExpandedWrap disabled
        Unit Unit2;
         Interface uses
         Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Corba, Server_c, Server_i, StdCtrls;
         Type
         TForm1 – class(TForm)
         Button1: TButton1;
          Procedure Button1Click(Sender: TObject);
         Procedure FormCreate(Sender: TObject);
        Private
        {private declarations}
        Protected
        { Protected declarations }
         vIMyTest: IMyTest; // skeleton object
        Procedure InitCorba;
        Public
        {public declarations }
        end;
        var Form1 : TForm1;
        implementation
        {$R *.DFM}
        Procedure TForm1.FormCreate(Sender: TObject);
        Begin
         vIMyTest := TIMyTestHelper.bind;
        end;
        procedure TForm1.Button1Click(Sender: TObject);
        var n:integer;
        begin
        n:=vIMyTest.AddNmb(2,3);
        ShowMessage(IntToStr(n));
        End;
        End.
      ЗАМЕЧАНИЕ Для того чтобы компиляция серверного и клиентского приложения проходила нормально, в список подключаемых модулей необходимо добавить ссылку на автоматически сгенерированные файлы – в нашем случае это Server_c и Server_i .

      Тестирование CORBA – проекта

      Запуск и использование объекта CORBA
      В реальных проектах сервер CORBA запускается на более мощных компьютерах, чем ПК, на котором расположена клиентская программа CORBA, что позволяет более эффективно обрабатывать запросы. Однако тестовый пример вполне может работать и на локальном компьютере, под управлением Windows 9x. Брокеру всё равно, расположены ли соответствующие объекты на одном компьютере или на ста разных, главное, чтобы они зарегистрировали свои интерфейсы.
      А как произойдёт регистрация интерфейса только что созданного сервера CORBA ?
      Автоматически. Хотя технология CORBA предусматривает несколько способов такой регистрации, в том числе и динамический, система Delphi 7 создаёт весь код, необходимый для регистрации заданного интерфейса, без участия человека.
      Перед запуском серверного модуля на компьютере должен быть запущен «интеллектуальный агент» SmartAgent – ресурс брокера, который автоматически обнаруживает объекты с интерфейсами, нудными клиентским программам. Он вызывается командой Пуск->Программы->VisiBroker->VisiBroker Smart Agent. На экране появляется пустое окно агента.
      Далее надо запустить с помощью, например, Проводника сервер CORBA (Project1.exe, появится тоже пустое окно) и для проверки его работы две (или пять, или больше) копий клиента CORBA Project2.exe
      В каждой из клиентских программ можно ввести два числа и мгновенно получить их сумму, щёлкнув на кнопке Button1. При этом суммирование реально выполняется, как уже говорилось, сервером CORBA, а работать он может и на другом компьютере, обрабатывая запросы любого числа клиентов CORBA. Производительность серверного объекта и скорость его ответа на запросы клиентов определяется только ресурсами того компьютера, на котором он запущен.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0226 ]   [ 17 queries used ]   [ Generated: 28.03.24, 17:51 GMT ]