Прототип к варианту 2 - Взаимодействие приложений

Страницы работы

Фрагмент текста работы

Прототип к варианту 2  - Взаимодействие приложений

Одной из классических имитаций схем клиент/сервер, демонстрирующей использование общей памяти, является супермаркет. Сервер выполняет функции кассира, который ожидает прихода покупателей, потом подсчитывает сумму их покупок и сообщает итог. Клиент является аналогом покупателя, который ожидает открытия кассы и предъявляет свои покупки кассиру. На рис. 1 показаны рабочие окна двух приложений, ckClient и ckServe. В окне приложения ckClient («покупателя») имеется текстовое поле для ввода идентификатора клиента и флажок, при установке которого выдается запрос на обслуживание. Список заполняется итоговыми суммами всех успешно обработанных заявок. В окне приложения ckServe («кассира») также присутствует текстовое поле, в котором вводится идентификатор «кассы», и флажок, установка которого означает готовность сервера к обслуживанию. В списке перечислены все успешно обработанные операции (разумеется, суммы у «покупателя» и «кассира» должны совпадать). Каждое приложение содержит простейший управляющий механизм, срабатывающий при обработке событий таймера. Это сделано для того, чтобы замедлить работу приложения и более наглядно продемонстрировать происходящее. Следует учитывать, что это очень простые программы с минимальной проверкой ошибок; конечно, они ни в коем случае не являются строгой имитацией взаимодействий клиент/сервер.

Рис. 1 Рабочие окна приложений ckServe и ckClient

Описание проекта

Проект ckServe состоит из трех файлов. В файле FRMSERVE.FRM определяется единственная форма, используемая в программе. Единственный модуль, CHKSTAND.BAS, содержит объявления констант и функций, а также открытые объявления типов. Файл APIGID32.BAS содержит объявления функций библиотеки динамической компоновки APIGID32.DLL.

Проект ckClient также состоит из трех файлов. В файле FCLIENT.FRM определяется единственная форма, используемая в программе. Два других файла — те же, что и в ckServe.

В листинге 13.3 приведен общий модуль CHKSTAND.BAS. В листинге 13.4 приведено определение формы FRMSERVE.FRM, а в листинге 13.5 — определение формы FCLIENT.FRM.

Наиболее важной структурой, определяемой в модуле CHKSTAND.BAS, является структура Check-Stand. Эта структура используется при обмене информацией между клиентским и серверным приложением. Клиентское приложение проверяет состояние поля Total и узнает, свободен ли сервер. Если значение поля равно нулю, клиент загружает набор цен (массив Prices) покупаемых товаров и заполняет поле Done, тем самым сообщая серверу о своей готовности. Сервер суммирует цены отдельных товаров, после чего заполняет поле Total и сбрасывает поле Done. Клиент сбрасывает поле Total, сообщая, что обслуживание «покупателя» завершено и «касса» готова обработать новую заявку. Клиент также заполняет поле Client, чтобы сервер мог занести имя клиента в свой список.

Листинг 13.3 CHKSTAND.BAS

Сервер определяет четыре переменных уровня формы. В них хранится манипулятор открытого файла, а также манипулятор и адрес связанного с ним объекта файлового отображения. Фиктивная структура Security используется для установки стандартных атрибутов безопасности при открытии файла.

Основная часть работы, связанной с инициализацией и завершением работы сервера, выполняется в процедуре флажка chkOpen. Хотя сервер выполняет сборку мусора, он не рассчитан на корректный разрыв связи с текущим клиентом. Другими словами, вместо того чтобы проверить, «обслуживается» ли в настоящий момент «покупатель», и завершить текущую операцию, сервер немедленно отключается и оставляет клиента вечно ждать обслуживания (чем, вероятно, тот будет весьма недоволен). Доработка примера и реализация корректного завершения связи поручается читателю — задача не слишком сложна, если учесть, что хорошее решение продемонстрировано в приложении ckClient.

Если сервер свободен, приложение создает новый файл, содержащий одну структуру Check-Stand. Файл открывается в монопольном режиме — другие приложения могут редактировать его содержимое через объект файла, отображаемого на память, но сам объект файла принадлежит серверу и недоступен для других приложений.

Сервер записывает одну пустую структуру CheckStand в файл, чтобы

Похожие материалы

Информация о работе