- •107 Методические указания «Программное обеспечение сетей эвм. Часть 4. Версия 2. Развитие схемы «клиент-сервер» в com и corba»
- •Введение
- •1.1. Необходимость использования компонент
- •1.2. Методы встраивания компонентов
- •1.3. Основы com
- •1.4. Типы компонентов
- •1.5. Размещение управляющих элементов при помощи cWnd
- •1.6. Использование директивы #import
- •1.7. Компоновка тестовой программы
- •1.7.1 О компонентах
- •1.7.2 Регистрация компонентов
- •1.7.3 Импортирование библиотеки типов
- •1.7.4 Определение членов cDemoClientView
- •1.7.5 Создание компонентов
- •1.7.6 Создание точек взаимодействия
- •1.7.7 Синхронизация параметров
- •1.7.8 Обработка событий от компонентов
- •1.7.9 Очистка
- •1.7.10 Шаблонный код
- •1.9. Индивидуальные задания на работу
- •2.1. Проект. Основные принципы
- •2.2. Как создать компонент
- •Шаг 2: Создание компонента:
- •2.3. Значения по умолчанию
- •2.5. Индивидуальные задания на работу
- •3.1. Cоздание сервера com
- •3.2. Использование com-объектов
- •3.3. Индивидуальные задания на работу
- •Лабораторная работа № 4. Использование atl
- •4.1 Создание dcom-сервера с использованием atl
- •4.1.1 Введение в atl
- •4.1.2 Что такое atl?
- •4.1.3 Разделение труда
- •4.1.4 Создание хранилища компонентов с помощью atl Com AppWizard
- •4.1.5 Вставка кода заглушки/прокси-объекта.
- •4.1.7 Atl com-карта
- •4.1.9 Класс cComModule
- •4.1.10 Язык скриптов реестра в atl
- •4.1.11 Распределенная com (dcom)
- •4.1.12 Dcom и службы nt
- •4.1.13 Структура службы nt
- •4.1.14 Основанный на службах nt сервер сом
- •4.1.15 Создание проекта при помощи atl
- •4.1.16 Добавление функциональных средств
- •4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
- •4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
- •4.2 Создание dcom сервера
- •4.3 Создание dcom клиента
- •4.4 Индивидуальные задания на работу
- •Лабораторная работа № 5. Разработка corba приложений
- •5.1. Конфигурирование
- •5.2. Порядок действий
- •5.3. Объектно-ориентированный анализ и моделирование
- •5.4. Описание и трансляция объектов
- •5.5. Создание сервера
- •5.6. Создание клиента
- •5.7. Отладка объектов
- •5.8. Индивидуальные задания на работу
- •Лабораторная работа № 6. Адаптер роа
- •6.1. Архитектура poa
- •6.2. Политики poa
- •Политика обработки запросов
- •6.3. Создание серверов на основе poa
- •6.4. Индивидуальные задания на работу
- •Лабораторная работа № 7. Прикладная задача связи
- •7.1. Постановка задачи
- •7.1.1. Сотовая станция
- •7.1.2. Телефоны
- •7.1.3. Система
- •7.2. Функционирование системы
- •7.3. Индивидуальные задания на работу
- •Лабораторная работа № 8. Работа по умолчанию
- •8.1. Сервер с сервантом по умолчанию
- •8.2. Индивидуальные задания на работу
- •Лабораторная работа № 9. Создание менеджеров сервантов
- •9.1. Менеджеры сервантов
- •ServantActivator
- •ServantLocator
- •9.2. И снова практика
- •9.3. Индивидуальные задания на работу
- •Лабораторная работа № 10. Сервис именования
- •10.1. Сервис для именования (Naming Service)
- •10.2. Индивидуальные задания на работу
5.6. Создание клиента
Приложение, выполняющее роль клиента для объекта, намного проще, чем сервер. Хотя и для него установлена некоторая последовательность действий:
инициализация ORB;
получение ссылки на экземпляр CORBA-объекта;
использование объекта в мирных целях.
Инициализация ORB такая же, как и при создании сервера. Получение ссылки на объект производится вызовом его метода связывания:
Для Си++:
Test::Service_var service =
Test::Service::_bind
(”ServiceObj”);
Для Java:
Test.Service service =
Test.ServiceHelper.bind(orb,
«”ServiceObj”);
Естьразницав именах методов ивих разномрасположении. Для Си++ метод _bind() описывается непосредственно в классе объекта, а для Java метод bind() помещается в отдельный класс-хэлпер.
Отличие VisiBroker for C++ от VisiBroker for Java в том, что в качестве ссылки на объект используются экземпляры специального класса.Впримеревыше видно, что имя типа ссылки начинается с имени интерфейса и заканчивается суффиксом _var. Описание класса данного типа делается компилятором idl2cpp. Прелесть _var-классов состоит в прозрачности их использования. Перегруженные операторы дают возможность присваивать значения ссылок, пользоваться для доступа к методам объекта операцией разыменовывания указателя (->) и автоматически удалять объекты после окончания их использования.
Осталось разобраться, как клиент может вызывать операции объекта. Вот типичный пример, когда клиент хочет узнать значение числа p:
Для Си++:
CORBA::Float value =
service->get_PI_value();
Для Java:
float value =
service.get_PI_value();
5.7. Отладка объектов
Помощь при отладке CORBA-программ могут оказать файлы протокола. К примеру, текстовый вывод в стандартные потоки cout, clog и cerr попадут в файлы visout.log, vislog.log и viserr.log соответственно.
Много полезного можно узнать из файлов протокола osagent.log и oad.log, если добавить ключ командной строки -v при запуске Smart Agent и Object Activation Daemon.
В VisiBroker for Java естьспециальный отладчик vbdebug, позволяющий просмотреть имеющиеся объекты и обращения к ним. Но инструмент этот рудиментарный и неудобный. Он требует многих манипуляций и постоянной работы руками,поэтому лучше всего использовать старый проверенный опыт трассировки — вывод текстовой информации в поток. Этот способ прекрасно подходит для отслеживания обращений к объектам. С клиентской частью все намного проще. Стандартный отладчик способен распознать висячие ссылки.Большего и не нужно.
В дальнейшем для эффективной работы также целесообразно повторить (или освоить)язык IDL, обратив внимание на то, как он транслирует свои конструкции на языки программирования.
5.8. Индивидуальные задания на работу
5.8.1. Общее задание для всех студентов.Проверить наличие библиотекиWSOCK32.DLLи зарегистрировать приложение в библиотеке, определить описание реализации интерфейсаWindowsSocketи его текущее состояние.
5.8.2. Индивидуальное задание для каждого студента.Подготовить приложение к созданию четырех сокетов - двух датаграммных сокетов и двух сокетов виртуального канала, с максимальным размером датаграммного пакета, равным числу из последних трех цифр номера зачетной книжки студента. Формат адреса соответствует принятому вInternet.
5.8.3. Индивидуальное задание для каждого студента.Задать параметры сокетов, подготовив структуры типаsockaddr. Предусмотреть возможность работы: в широковещательном режиме для первого сокета; с определеннымиIP-адресами для второго и третьего сокетов, равными соответственно «192.168.ZZZ.1ХХ» и «192.168.ZZZ.1ХХ+1», гдеZZZ– номер подсети, указанный преподавателем, ХХ – последние две цифры номера зачетной книжки студента; с любым адресом для четвертого сокета.
5.8.4. Индивидуальное задание для каждого студента.В файлеHOSTSопределить четыре доменных имени для собственной рабочей станции и другой рабочей станции с номером, равным «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8»). В состав доменных имен ввести собственные инициалы. Имена связать с локальными датаграммным и виртуальным адресами «192.168.ZZZ.1ХХ» и «192.168.ZZZ.1ХХ+1», а также с удаленными датаграммным и виртуальным адресами «192.168.ZZZ.1ХХ+2» и «192.168.ZZZ.1ХХ+3». Выполнить с помощью функцииgethostbynameполучение указателей на структуры, характеризующие имена и адреса узлов.
5.8.5. Общее задание для всех студентов.Выполнить привязку всех подготовленных адресов и сокетов. Спровоцировать возврат функциейbindзначенияSOCKET_ERRORпо причине:
Код ошибки Описание
WSANOTINITIALISEDПеред использованием функции необходимо вызвать функциюWSAStanup
WSAENETDOWNСбой в сети
WSAEADDRINUSEУказанный адрес уже используется
WSAEFAULTЗначение параметраnamelenменьше размера структурыsockaddr
WSAEINPROGRESSВыполняется блокирующая функция интерфейсаWindowsSockets
WSAEAFNOSUPPORTЭтот протокол не может работать с указанным семейством адресов
WSAEINVALСокет уже привязан к адресу
WSAENOBUFSУстановлено слишком много соединений
WSAENOTSOCKУказанный в параметре дескриптор не является сокетом
5.8.6. Общее задание для всех студентов.Для освобождения ресурсов последовательно закрыть все сокеты и завершить работу приложения сWindowsSockets.
5.8.7. Общее задание для всех студентов.По результатам лабораторной работы подготовить полный протокол, включающий формулировку пунктов задания, краткое описание реализации каждого из пунктов задания с фрагментами кода, выводы по каждому из пунктов задания.