Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
26
Добавлен:
02.05.2014
Размер:
384.51 Кб
Скачать

6.2. Концепции технологии Клиент-Сервер

Технология клиент/сервер - это распределение прикладной программы по двум логически различным компонентам, каждый из которых выполняет свои отдельные функции.

Обычно клиент дает запросы на сервер на выполнение от своего имени определенной работы. Задачей сервера является обработка запросов и возврат результатов клиенту.

З а п р о с ы

|- - > - > - > - | > - > - > - > ----------|

^ | v

---|------ | -----|----

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

---|----- | -----|----

^ | v

|-- - < - < - < - | < - < - < - < ----------|

О т в е т ы

Этот процесс чаще всего происходит на физически разделенных компьютерах через тот или иной тип локальной сети. Хотя и не обязательно.

Чтобы приложение стало действительно приложением клиент/сервер, необходима соответствующая архитектура. Логика приложения должна быть разделена на отдельные компоненты - запрашивающий компонент, который дает запросы и ожидает возврата от отвечающего компонента - сервера.

Такое логическое разделение позволяет лучше подготовить приложение к распределению в сети.

Независимость компонентов приложения - обязательное требование архитектуры клиент/сервер.

Какие из компонентов приложения лучше рассматривать как клиентские, а какие - как серверные, является вопросом проектирования. Можно дать лишь следующие общие рекомендации:

Клиент: ввод/вывод информации; взаимодействие с пользователем; формулировка запросов; логика приложения.

Сервер: запросы к совместно используемым ресурсам; обработка транзакций.

Правильное распределение кода по клиентскому и серверному компонентам является ключевым в проектировании.

Взаимодействие между серверными и клиентскими компонентами приложения может быть декомпозировано на приведенные выше 7 уровней. И на каждом из уровней, особенно начиная с 3-го, можно выделять клиентский и серверный компоненты.

Существует множество методов взаимодействия между клиентскими и серверными компонентами: Выбор метода определяется тем, к какому из двух видов относится взаимодействие: к внутреннему или внешнему.

6.3. Внутренние коммуникации между процессами

6.3.1. Неименованные каналы

Канал – это участок разделяемой памяти, который процессы могут использовать для взаимодействия. Процесс, который создает канал, является процессом – сервером. Процесс, который соединяется с каналом, является процессом – клиентом. Один процесс пишет информацию в канал, другой процесс читает из канала.

Каналы могут быть двух типов:

  1. неименованные каналы;

  2. именованные каналы.

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

Неименованный канал создается вызовом:

CreatePipe(&hReadPipe,&hWritePipe,NULL,0);

Вызов возвращает две ссылки, одна из которых используется для чтения, а другая для записи.

Там, где передан 0, указывается размер канала. При значении 0 система устанавливает размер по умолчанию.

Чтение производится вызовом:

ReadFile(hReadPipe,&NewByte,1,&NumberOfBytesRead,NULL);

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

Запись производится вызовом:

WriteFile(hWritePipe,Buffer,nBytes,&NumberOfBytesWritten,NULL);

Если процесс обратился с записью в полный канал, то он будет заблокирован, пока какой-нибудь другой процесс не считает данные.

Канал закрывается вызовами:

CloseHandle(hReadPipe);

CloseHandle(hWritePipe);

Соседние файлы в папке Шпоры по СПО