Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
482
Добавлен:
28.03.2015
Размер:
5.84 Mб
Скачать

Листинг 1.4.Пример сервера

uses

header.pas;

var

m1, m2: TMessage; /* входящее и исходящее сообщения */

r: integer; /* код результата */

begin

while(TRUE) do /* сервер работает непрерывно */

begin

receive(FILE_SERVER, m1); /* блок ожидания сообщения */

case m1.opcode of /* в зависимости от типа запроса */

OP_CREATE: r := do_create(m1, m2);

OP_READ: r := do_read(m1, m2);

OP_WRITE: r := do_write(m1, m2);

OP_DELETE: r := do_delete(m1, m2);

else r := E_BAD_OPER;

end;

m2.result := r; /* вернуть результат клиенту */

send(m1.source, m2): /* послать ответ */

end

end.

Листинг 1.5.Клиент, использующий сервер из листинга 1.4 для копирования файла

uses

header.pas;

/* процедура копирования файла через сервер */

function copy(src: string, dst: string): integer;

var

m1: TMessage; /* буфер сообщения */

position: longint; /* текущая позиция в файле */

client: longint = 110; /* адрес клиента */

begin

initialize(); /* подготовиться к выполнению */

position := 0;

repeat

m1.opcode := OP_READ; /* операция чтения */

m1.offset := position; /* текущая позиция в файле */

m1.count := BUF_SIZE; /* сколько байт прочитать */

m1.name := src; /* скопировать имя читаемого файла*/

send(FILESERVER, m1); /* послать сообщение на файловый сервер*/

receive(client, m1); /* блок ожидания ответа */

/* Записать полученные данные в файл-приемник. */

m1.opcode := OP_WRITE; /* операция: запись */

m1.offset := position; /* текущая позиция в файле */

m1.count := m1.result; /* сколько байт записать */

ml.name := dst); /* скопировать имя записываемого файла*/

send(FILE_SERVER, m1); /* послать сообщение на файловый сервер */

receive(client, m1); /* блок ожидания ответа */

position := position + m1.result; /* в m1.result содержится количество записанных байтов */

until( m1.result <= 0 ); /* повторять до окончания */

/* вернуть ОК или код ошибки */

if(m1.result >= 0 then result := OK else result := m1.result);

end;

Разделение приложений по уровням

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

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

- уровень пользовательского интерфейса;

- уровень обработки;

- уровень данных.

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

Уровень пользовательского интерфейса

Уровень пользовательского интерфейса обычно реализуется на клиентах. Этот уровень содержит программы, посредством которых пользователь может взаимо­действовать с приложением. Сложность программ, входящих в пользовательский интерфейс, весьма различна.

Простейший вариант программы пользовательского интерфейса не содержит ничего, кроме символьного (не графического) дисплея. Такие интерфейсы обыч­но используются при работе с мэйнфреймами. В том случае, когда мэйнфрейм контролирует все взаимодействия, включая работу с клавиатурой и монитором, мы вряд ли можем говорить о модели клиент-сервер. Однако во многих случаях терминалы пользователей производят некоторую локальную обработку, осуще­ствляя, например, эхо-печать вводимых строк или предоставляя интерфейс форм, в котором можно отредактировать введенные данные до их пересылки на главный компьютер.

В наше время даже в среде мэйнфреймов наблюдаются более совершенные пользовательские интерфейсы. Обычно на клиентских машинах имеется как ми­нимум графический дисплей, на котором можно задействовать всплывающие или выпадающие меню и множество управляющих элементов, доступных для мыши или клавиатуры. Типичные примеры таких интерфейсов — надстройка X-Windows, используемая во многихUNIX-системах, и более ранние интерфейсы, раз­работанные для персональных компьютеров, работающих под управлениемMS-DOSиAppleMacintosh.

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