Скачиваний:
14
Добавлен:
01.05.2014
Размер:
317.44 Кб
Скачать

3. Удаленные вызовы процедур

Вспомним опять традиционную модель процедурного программирования. Прикладная программа выглядит как последовательность вызовов процедур, следующим образом:

Begin

...

Call1;

Call2;

...

End.

Удаленные вызовы процедур – это средство расширения традиционной модели программирования на распределенные системы.

Хотя и можно использовать УВП сами по себе, чаще они все-таки являются средством реализации COM и DCOM.

Понятия интерфейса и глобально уникальных идентификаторов являются фундаментальными для RPC, COM и DCOM.

В технологии RPC также есть клиент и сервер. При этом запрос от клиента выглядит по форме как вызов процедуры, но эта процедура включает в себя всю последовательность действий по передаче данных на сервер, обработке запроса и посылке ответа клиенту.

Процедурный интерфейс скрывает все эти действия.

Базовым недостатком RPC является синхронность. Т.е. когда клиент обращается с RPC-запросами к процедуре сервера, то он блокируется до момента, пока сервер не выполнит функцию и не возвратит результаты.

Существуют усовершенствованные RPC, обеспечивающие асинхронные вызовы. В них для оповещения клиента о выполнении RPC используются обратные вызовы. Хотя структура синхронной программы существенно проще асинхронной.

Программа, реализующая технологию клиент/сервер с помощью RPC, будет выглядеть следующим образом:

Begin

...

CSInterface(Call1);

CSInterface(Call2);

...

End.

Процедура CSInterface() - интерфейсная процедура, первый аргумент которой - это, обычно, имя серверной процедуры, которую необходимо выполнить. Могут передаваться и дополнительные параметры в процедуру CSInterface().

Структура удаленного вызова процедуры может выглядеть следующим образом:

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

Procedure CSInterface(P : Procedure);

Begin

Case P Of

Call1 : Begin

Создание структур данных для передачи по сети;

Посылка запроса на сервер;

Выполнение процедуры Call1 на сервере;

Подготовка ответа;

Посылка ответа клиенту;

Прием ответа;

End;

Call2 : Begin

...

End;

Else

...

End Case;

End CSInterface;

Синхронный характер процедурного интерфейса иллюстрируется следующим рисунком:

Клиент Сервер

------------------- -------------------

| | | |

|1. ServerRequest | -----> 2. ------> |-----> 3. |

| (приостанов | | . |

| выполнения) | | . |

| 6.<-----| <----- 5. <------ |4. RespondClient;|

| . | | |

| . | | |

------------------- -------------------

Цифры показывают порядок происходящих событий:

  1. Запрос;

  2. Передача запроса;

  3. Начало обработки запроса;

  4. Ответ;

  5. Посылка ответа;

  6. Получение результата клиентом.

Реализация без ожидания иллюстрируется следующим образом:

Клиент Сервер

------------------- -------------------

| | | |

|1. ServerRequest | -----> 2. ------> |-----> 3. |

| . | | . |

| . | | . |

| 6.<-----| <----- 5. <------ |4. RespondClient;|

| . | | |

| . | | |

------------------- -------------------

Клиент дает запрос серверу и асинхронно продолжает работать одновременно с серверным приложением. Позднее клиент либо запрашивает сервер, либо получает уведомление через специальное средство процедуру обратного вызова.

Структура программы клиента с процедурой обратного вызова включает в себя следующие элементы:

1) Описание процедуры обратного вызова. Содержание процедуры обратного вызова полностью определяется характером задач уровнем протокола. На сетевом уровне (3) - это может быть простая установка флага, извещающего клиента о завершении операции. На уровне презентации (6), например, в протоколе DDE, - это достаточно сложные действия.

Procedure CallbackProc;

Begin

...

End CallbackProc;

2) Предусматривается передача адреса процедуры CallbackProc обратного вызова интерфейсной процедуре CSInterface. Если в качестве фактического параметра передается NULL, то выполнение процедуры CSInterface происходит синхронно, а если передается не NULL, а адрес CallbackProc, то выполнение происходит асинхронно.

Т.е. по выполнению запроса коммуникационная среда сама вызывает процедуру CallbackProc, и тем самым оповещает клиента о выполнении запроса.

Приведенная технология асинхронного взаимодействия клиента и сервера на основе процедуры обратного вызова широко используется на всех уровнях коммуникаций, и далее мы в этом убедимся.

Создание RPC начинается с описания интерфейса, экспортируемого сервером.

Интерфейс создается на языке описания интерфейсов IDL (Interface Definition Language). Язык описания интерфейса имеет строго определенные правила. Например:

  1. Все функции имеют тип void

  2. Параметры сопровождаются модификаторами [in], [out] (входной, выходной)

  3. Типы данных стандартные (int, long). ANSI

Текст интерфейса обрабатывается специальным компилятором, в результате чего формируются так называемые суррогаты (stubs) клиента и сервера.

Суррогат клиента выполняет следующие действия:

  1. Преобразует параметры в вид, пригодный для передачи по каналу

  2. Устанавливает соединение с сервером

  3. Передает серверу данные

  4. Ждет ответа от сервера

  5. Получает данные

  6. Преобразует данные в вид, пригодный клиенту

  7. Передает данные клиенту

Суррогат сервера выполняет следующие действия:

  1. Ждет запросы от клиентов

  2. Получив запрос, преобразует принятые данные в вид, пригодный для выполнения процедуры

  3. Выполняет процедуру

  4. Готовит данные-результаты к передаче по каналу

  5. Передает данные по каналу.

Внешне программа клиента, вызывающего удаленную процедуру, очень похожа на программу, вызывающую локальную процедуру.

Программа сервер существенно сложнее реализуется, чем программа-клиент. Этапы инициализации сервера следующие:

  1. Регистрирует в библиотеке RPC коммуникационный протокол, который будет поддерживать сервер (TCP/IP или именованные каналы)

  2. Регистрирует в библиотеке RPC интерфейс, который поддерживает сервер

  3. Получает набор ссылок, через которые сервер будет взаимодействовать с библиотекой RPC

  4. Через полученные ссылки публикует свои возможности в специальной базе данных “RPC name service database”. Клиент запрашивает специальный сервис “RPC name service” при поиске сервера, способного выполнить запрос.

  5. Переходит в состояние ожидания запросов.

Непосредственное соединение обеспечивают специальные библиотеки. При этом возможна передача как по протоколам TCP/IP (сокеты), так и через именованные каналы.

Соседние файлы в папке Материалы к курсу