клиент сервер приложение delphi
Delphi: Пишем шаблон клиент-серверного приложения
Продолжая тему разработки собственной утилиты администрирования, в данной статье я рассмотрю типовой шаблон программы клиент-сервер, на базе которой можно разрабатывать собственные клиент-серверные приложения. Данный типовой шаблон для простоты понимания и удобства применения будет рассмотрен на примере компонентов ClientSocket и ServerSocket.
Для тех, кто не в курсе, что значит клиент-серверное приложение, поясню: это комплекс программ (модулей) состоящий из двух частей — клиентской и серверной. Серверная часть является «главной»- так называемый командный пункт, на который возложена задача поддержания связи со всеми клиентами и раздача команд управления, соответствующих их функционалу (управление клиентами). Клиентская же часть является второстепенной, но не менее важной, так как является важным и связующим элементом, позволяющим выполнять удаленные команды (функции) на компьютере, на котором установлен.
>Компоненты ClientSocket и ServerSocket, которые мы будем использовать, находятся на вкладке Internet. Если на этой вкладке у Вас нет этих компонентов (а по умолчанию при установке Delphi7 они не ставятся), необходимо установить их самостоятельно (пакет dclsocketsXX.bpl). Данный пакет можно найти на установочном диске Delphi7 (или в папке «C:\Temp», куда распаковывается дистрибутив перед установкой — «C:\Temp\delphi7\install\program files\borland\delphi7\bin\») или можете его скачать отсюда. Чтобы установить данный пакет, запустите Delphi7. Зайдите в меню Component->Install Packages. В появившемся окне нажмите кнопку «Add» и укажите место, где расположен пакет dclsocketsXX.bpl. После этого жмите ОК. Компонент на месте.
Надеюсь все объяснил доступно =). А теперь приступим к делу и начнем мы с серверной части. Для этого создадим проект и скинем на форму компонент ServerSocket. В настройках компонента ServerSocket укажем следующее:
Active = false
Name = ss
Port = 4321
ServerType = stNonBlocking
А также для удобства скинем компонент Memo, в который будем выводить всякую инфу. Дадим имя компоненту log.
Далее, для компонента ServerSocket определяем метод onClientConnect, чтобы определять момент подключения клиентов. Вставим следующий код:
Создание клиент-серверного приложения в Delphi
1. Таблица первая, назовем ее First
|
Ну вот, как бы, с базой и все.
Программа
2.1. Приложение сервер.
Созданим новое приложение и сохраним его под именем Server в папке C:\ClientServer\Server. Добавим в приложение Remote Data Module с вкладки Multitier репозитария (Рис. 1).
Все остальное оставим без изменений. После нажатия кнопки «Ок» в проекте появится форма подобная обычному дата модулю с именем Test. Сохраним ее под именем RDMFrm.pas.
У компонентов DataSetProvider:
|
2.2. Приложение клиент
Создадим новое приложение, и сохраним его в папке C:\ClientServer\Client под именем Client. Разместим на главной форме по два компонента ClientDataSet(обзовем их cdsFirst, cdsSecond), DataSource(обзовем их dsFirst, dsSecond), DBGrid(обзовем их dbgFirst, dbgSecond) один компонент SocetConnection.
SocetConnection
Если вы все сделали правильно, то при установке свойства Connected в True, должно запустится приложение сервер.
ClientDataSet
|
Запустим Редактор Полей (двойной клик по компоненту) и занесем туда все поля. Для компонентов ClientDataSet напишем обработчик sdsAfterPost
И подставим его на обработку события AfterPost обоих ClientDataSet’ов.
DataSource
|
DBGrid
|
Запустим Редактор колонок (двойной клик по компоненту) и занесем туда все поля.
Положим на форме возле Гридов по кнопке и в обработчик onClick запишем:
Все. Закрываем Делфи (для чистоты эксперимента). И запускаем приложение клиент. Если вы все сделали правильно то вы должны увидеть нечто подобное этому
Если статья получит отзывы и заслужит интерес у читателей, то продолжение не заставит себя долго ждать.
Создание простейшего клиент-серверного приложения в Делфи
Автор: © Aleksandr Shevchuk
Раз приложение простейшее, то я решил использовать БД MS Jet 4.0 (проще говоря БД MS Access). Это решение вызвано тем что Jet (прошу не путать с MS Access) является бесплатным продуктом и поставляется вместе с MS Windows (то бишь для работы нашей программы ненужно устанавливать на компьютер клиента сам Access). Да и редактор БД очень неплохой, и ядро поддерживает кучу типов полей для удовлетворения самых извращенных желаний при хранении данных.
Ну вот, как бы, с базой и все.
2.1. Приложение сервер.
Созданим новое приложение и сохраним его под именем Server в папке C:\ClientServer\Server. Добавим в приложение Remote Data Module с вкладки Multitier репозитария (Рис. 1).
У компонентов DataSetProvider:
|
2.2. Приложение клиент
Создадим новое приложение, и сохраним его в папке C:\ClientServer\Client под именем Client. Разместим на главной форме по два компонента ClientDataSet(обзовем их cdsFirst, cdsSecond), DataSource(обзовем их dsFirst, dsSecond), DBGrid(обзовем их dbgFirst, dbgSecond) один компонент SocetConnection.
Если вы все сделали правильно, то при установке свойства Connected в True, должно запустится приложение сервер.
ClientDataSet
|
Запустим Редактор Полей (двойной клик по компоненту) и занесем туда все поля. Для компонентов ClientDataSet напишем обработчик sdsAfterPost
И подставим его на обработку события AfterPost обоих ClientDataSet’ов.
DataSource
|
DBGrid
|
Все. Закрываем Делфи (для чистоты эксперимента). И запускаем приложение клиент. Если вы все сделали правильно то вы должны увидеть нечто подобное этому
Разработка клиент-серверного приложения на Delphi
В этой статье я постараюсь поделиться опытом по созданию клиент-серверных приложений с использованием стандартных компонентов Indy HTTPServer и Indy HTTPClient.
Создадим 2 проекта: MyServer.dpr и MyClient.dpr. На главную форму MyServer добавим компонент TIdHTTPServer (закладка Indy Servers) и TMemo (для отображения клиентского запроса). Немного отредактируем параметры сервера: «Active=true», «DefaultPort=56001» (можно указать любой другой) и «Name=MyServer». У этого компонента есть событие OnCommandGet. Переходим к его редактированию.
В данном случае мы просим сервер выполнить вход в систему пользователя «admin» с паролем, зашифрованным при помощи md5.
Вот таким нехитрым способом можно создавать клиент-серверные приложения. Чтобы не запутаться в именах параметров, рекомендую сделать отдельный unit с константами, который знали бы и сервер, и клиент. В следующей статье я объясню, как оптимизировать передачу данных по http и упростить их обработку, а также поделюсь своими компонентами, упрощающими подобную разработку.
Узнать подробнее можно здесь
Ссылки по теме
Помощь |
Задать вопрос | |
программы | |
обучение | |
экзамены | |
компьютеры | |
ICQ-консультанты | |
Skype-консультанты | |
Общая справка | |
Как оформить заказ | |
Тарифы доставки | |
Способы оплаты | |
Прайс-лист | |
Карта сайта | |
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО. На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. Построение клиент-серверных баз данных в DelphiДо настоящего момента мы рассматривали только локальные базы данных, не затрагивая многопользовательского доступа. Целью данного занятия является обсуждение особенностей, присущих удаленным базам данных. Напомним, что при использовании технологии «клиент-сервер» база данных располагается на удаленном компьютере (сервере) и называется удаленной базой данных. Приложение, обеспечивающее доступ к базе данных с компьютера пользователя, называется приложением-клиентом. Взаимодействие клиента и сервера можно описать двумя фразами (рис. 9.1): Преимущества такого метода работы очевидны: Хранимая процедура — это небольшая программа, которая расположена на сервере базы данных и которую можно вызвать из приложения-клиента. Хранимые процедуры позволяют ускорить работу с данными на сервере базы данных благодаря следующим преимуществам: Для выполнения хранимой процедуры в Delphi был введен компонент TStoredProc. Рассмотрим его основные свойства. Свойство DatabaseName типа String указывает на компонент TDatabase, используемый для установления соединения с базой данных. Это свойство аналогично одноименному свойству компонентов ТTable и TQuery. Свойство StoredProcName типа String определяет хранимую процедуру, которая должна вызываться. Имя хранимой процедуры выбирается н выггядяющрм списке с помощью инспектора объектов. После выбора хранимой процедуры можно устанавливать два других свойства. Свойство РагатэтипаТРагатзопределяет массив параметров компонента TStoredProc. Свойство ParamBindMode типа TParamBindMode определяет, как будет установлено соответствие между параметрамикомпонента TStoredProc и параметрами процедуры, и может принимать одно из следующих значений: Выполнение выбранной хранимой процедуры осуществляется с помощью вызовов методов Prepare и ЕхесРгос: Листинг 9.1 иллюстрирует вызов хранимой процедуры из приложения при нажатии кнопки Buttonl. Листинг 9.1. Вызов хранимой процедуры 01. procedure TForm1 Button1ClickSender: TObject); Для написания хранимых процедур и триггеров используется специальный язык хранимых процедур. Разные серверы используют разные диалекты. Мы не будем изучать их все, а кратко рассмотрим язык хранимых процедур, использующийся сервером InterBase, который имеет много общего с языком Pascal. Язык хранимых процедур включает в себя операторы для управления ходом вычислительного процесса (ветвления, цикла), а также некоторые функциональные возможности языка SQL. Хранимая процедура создается оператором После имени процедуры следует необязательный список входных параметров, с помощью которых из приложения в процедуру могут передаваться исходные данные. Список выходных параметров, посредством которых в приложение возвращаются результаты выполнения процедуры, указывается после слова RETURNS. Каждый параметр описывается своим именем и типом, разделенными пробелом. Между различными параметрами должны стоять запятые. При использовании параметра в теле процедуры перед его именем необходимо ставить двоеточие. В текст хранимой процедуры допускается вставлять комментарии. Для вставки комментариев используются комбинации символов /* и */. Вновь созданную процедуру можно удалить или изменить. Для удаления процедуры служит оператор Для изменения существующей процедуры используется оператор Его список параметров идентичен списку параметров оператора Рассмотрим некоторые из основных элементов языка хранимых процедур. Заметим, что все операторы обязательно должны заканчиваться точкой с запятой (кроме составного оператора). Оператор объявления переменных имеет следующий вид: Переменные могут быть только того типа, который допускается в InterBase. Объявленные переменные являются локальными, то есть видимы исключительно внутри процедуры, в которой они были объявлены. Приведем пример объявления переменных: Оператор присваивания описывается следующим образом: ; Перед знаком равенства двоеточие не ставится! Переменная и выражение должны иметь одинаковый или совместимый тип, иначе возможна ошибка. Проиллюстрируем сказанное несколькими примерами: Оператор ветвления имеет вид: Этот оператор аналогичен оператору ветвления, использующемуся в Delphi. Оператор цикла оформляется аналогично такому же оператору в Delphi: Оператор выбора записи похож на инструкцию SELECT языка SQL, но дополнен следующим операндом: Каждое имя после двоеточия указывает переменную или выходной параметр, которому должно быть присвоено значение столбцов строки, полученной в результате выполнения команды SELECT. Здесь создается хранимая процедура pSelect, в которой для сотрудников из таблицы MyTable подсчитываются общая сумма заработной платы (по полю Zarplata) и среднее значение по организации. Полученные в результате выполнения процедуры значения будут присвоены выходным параметрам opSum и opSred. Входных параметров процедура не имеет. Оператор выхода из процедуры служит для досрочного выхода из процедуры и передачи управления вызывающей программе млн процедуре. Оператор выхода представляет собой ключевое слово EXIT Оператор вызова процедуры применяется для вызова из одной хранимой процедуры другой хранимой процедуры и записывается в общем виде так: Оператор вызывает хранимую процедуру с указанным именем и параметрами. Приведем пример вызова хранимой процедуры: Оператор посылки сообщения предназначен для уведомления о событии всех приложений-клиентов, связанных с сервером. Данный оператор имеет следующий вид: Триггер представляет собой процедуру, которая постоянно размещена на сервере базы данных (как и хранимая процедура) и вызывается автоматически при изменении записей базы данных. В отличие от хранимых процедур, триггеры нельзя вызывать из приложений-клиентов, а также передавать им параметры и получать от них результаты. По определению триггер похож на обработчик событий BeforeEdit, AfterEdit, Before-Delete, AfterDelete, Beforelnsert и Afterlnsert. Триггеры в основном используются для программной реализации бизнес-правил. С помощью триггеров накладываются различные ограничения (например, иа значения столбцов). Для создания триггера применяется оператор CREATE TRIGGER, который имеет следующий вид: Операнды ACTIVE и INACTIVE определяют, будет ли триггер активен сразу после его создания. По умолчанию ои будет активен (ACTIVE), то есть при наступлении определенного события триггер будет выполняться. Неактивный триггер (INACTIVE) при наступлении определенного события выполняться не будет. Таким образом, созданный триггер можно включать или выключать. Операнды BEFORE и AFTER указывают, когда будет выполняться триггер: до наступления определенного события (BEFORE) или после (AFTER). Операнды UPDATE, INSERT и DELETE определяют тип события, при возникновении которого будет выполняться триггер. Это такие типы событий, как изменение (UPDATE), добавление (INSERT) и удаление (DELETE) записей. Для каждого события можно создать несколько триггеров, которые будут выполняться (если они активны). Порядок их выполнения определяется операндом POSITION. Триггеры будут срабатывать в порядке возрастания чисел, указанных в данном операнде. Созданный триггер можно изменить или удалить. Удаление триггера осуществляется оператором Изменить уже существующий триггер можно с помощью оператора ALTER TRIGGER, который имеет такой же формат, что и оператор CREATE TRIGGER. Тело триггера программируется так же, как и тело хранимой процедуры. В таблицах InterBase отсутствует автоинкрементный тип. Для обеспечения уникальности значений ключевых столбцов совместно с триггерами используются генераторы. Генератор применяется для создания уникальных целочисленных значений. Генератор можно создать с помощью приведенного ниже оператора: Кроме непосредственного создания генератора, необходимо присвоить ему начальное значение. Для этого используется следующий оператор: Начальное значение — это число, начиная с которого будут генерироваться уникальные значения. К созданному генератору можно обращаться с помощью функции Данная (функция возвращает значение, увеличенное на целочисленный шаг относительно последнего сгенерированного значения. ВНИМАНИЕ: После определения начального значения и шага их изменять нельзя. В противном случае уникальность генерируемых значений может быть нарушена. Приведем пример создания генератора: Здесь создается генератор с именем MyGen, начальное значение которого равно 2. Пример обращения к этому генератору может быть таким: Все операции, выполняемые приложением-клиентом с данными на SQL-сервере, происходят в виде транзакций. Транзакцией называется группа из нескольких операции над данными из таблиц удаленной базы данных. Основным принципом транзакций является «либо все, либо ничего». Если во время выполнения набора действий (транзакции) па каком-то этапе невозможно произвести очередное действие, то нужно выполнить возврат базы данных к начальному состоянию (произвести откат транзакции). Таким образом (при правильном планировании транзакций) обеспечивается целостность базы данных. Далее мы расскажем, как начинать, завершать транзакции п управлять ими с помощью SQL-выражений. А также рассмотрим вопрос об использовании транзакций в приложениях, разработанных в Delphi. Вся приведенная информация относится к InterBase. Для управления транзакциями в Delphi имеются три основные команды: Команда для запуска транзакции в общем виде выглядит следующим образом: Команда содержит четыре необязательных параметра (перечисленные в квадратных скобках). Если эти параметры опустить, то получившаяся инструкция SET TRANSACTION равносильна выражению Перечислим параметры команды и их возможные значения. Если все действия, составляющие транзакцию, успешно выполнены или возникла ошибка, транзакция должна быть завершена, для того чтобы база данных оказалась в непротиворечивом состоянии. Для этого в Delphi есть две SQL-команды: Все транзакции в Delphi можно условно разделить на явные и неявные. Явная транзакция — это транзакция, начатая и завершенная с помощью методов компонента TDataBase: StartTransaction, Commit и RollBack. После начала явной транзакции все изменения, вносимые в данные, относятся к этой транзакции. Другого способа начать явную транзакцию, кроме использования компонента TDataBase, нет. Следовательно, в рамках одного соединения нельзя начать две транзакции. Неявная транзакция стартует при модификации данных, если в текущий момент нет явной транзакции. Неявная транзакция возникает, например, при выполнении метода Post для компонентов наборов данных ТТаblе и TQuery. Например, если вы отредактировали запись в TDBGrid и переходите на другую запись, то это влечет за собой выполнение метода Post, что, в свою очередь, приводит к началу неявной транзакции, обновлению данных внутри транзакции и ее завершению. Важно отметить, что неявная транзакция, начатая с помощью методов Post, Delete, Insert, Append и т. д., заканчивается автоматически.
|