Серверное программирование в Delphi

Dr.Zlobyus

(zlobyus@e-mail.ru)

Просматривая содержимое какого-нибудь сайта, ты загружаешь в свой компьютер статические и динамические HTML-страницы. Если с первыми все понятно, то с последними дело обстоит несколько иначе. Динамические веб-сервера могут быть построены на разных технологиях: CGI (Perl, C/C++), PHP, ISAPI, ASP. Сейчас самые распространенные - это CGI и PHP (хотя PHP-скрипты могут работать и через CGI-интерфейс). И так уж сложилось, что CGI ассоциируется именно с перлом, ведь на этом языке написано бесчисленное множество супернавороченных скриптов. Но на самом деле это может быть практически любой язык, в том числе C/C++ и даже Delphi. О последнем как раз и пойдет разговор в нашей сегодняшней статье.

Протоколы программирования

CGI (Common Gateway Interface) - это стандартный протокол связи между браузером и веб-сервером. Подробнее о нем ты можешь узнать из предыдущих номеров Х.

Вместо CGI можно воспользоваться совершенно другим подходом (путем обращения к интерфейсам API сервера), таким как ISAPI (Internet Server API), разработанным Microsoft, и NSAPI (Netscape Server API). ISAPI позволяет писать DLL, загружаемые в адресное пространство сервера и сохраняемые там какое-то время. Загрузив DLL, сервер получает возможность использовать для обработки каждого запроса отдельный поток. То есть сервер получает запрос, грузит DLL (если она еще не загружена!) и выполняет соответствующий код, результат которого и отсылается клиенту. А так как служебный обмен данными на сервере осуществляется через память, такие приложения работают на порядок быстрее, чем аналогичные CGI. Apache сервер тоже позволяет расширить свои возможности при помощи CGI, но он и поддерживает специальные библиотеки расширения (модули).

Как это в Delphi

Существует множество языков программирования, поддерживающих разработку серверных приложений. И вовсе не обязательно изучать новый язык только из-за того, что, по мнению некоторых, он имеет преимущество перед тем, к которому ты уже привык, и на котором писать код тебе значительно проще. Так что, если ты предпочел остальным языкам программирования именно Delphi, этот материал для тебя.

Я не зря перечислил все виды серверного программирования - все они поддерживаются Delphi, и их разработка в его среде приятна и несложна. Давай рассмотрим подробнее.

Конечно, разрабатывать CGI и другие типы серверных приложений в Дельфи можно по-разному, но я предлагаю использовать технологию WebBroker, поддерживающую иерархию классов VCL и CLX, что сильно упрощает разработку веб-приложений, а также специальный тип модулей данных (WebModule). Самое главное, что компонент WebModule является общим для всех типов приложений! Т.е. никаких изменений в коде, будь то ISAPI-, или CGI-проект, ты не найдешь! Единственное НО: если разрабатываешь проекты ISAPI, то код в разных версиях Дельфи будет отличаться, а если решил писать модули Apache, то их придется установить на сервер. Для этого помести свой модуль в папку modules сервера и отредактируй файл httpd.conf - читай комментарии внутри файла.

А теперь давай напишем простенькое веб-приложение.

Графический счетчик обращений

Почему я выбрал такой простой пример? Цель моей статьи - показать возможности Delphi, а дальше уже на твое усмотрение.

Итак, запускай Delphi и лезь в New -> Other -> Web Server Application. Далее появится диалоговое окно, в котором ты сможешь выбрать тип приложения (выбирай CGI). Перед тобой появилось окошко компонента WebModule1. Для построения приложения тебе придется редактировать Actions этого компонента. Добавь новый Action, нажав на кнопку Add new в диалоговом окне Editing Webmodule1.Actions. После этого создай обработчик события OnAction и напиши туда код из "Листинга счетчика".

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

А теперь давай разберемся с программой. Только сначала отредактируй раздел uses:

uses Windows, Graphics, Jpeg, ExtCtrls, SysUtils, Classes, HTTPApp;

Сам код объяснять не буду - там все очень просто. Расскажу лишь, как это работает. Существует два метода написания графических счетчиков: первый заключается в рисовании картинок с цифрами от 0 до 9 и последующей комбинации из них нужного числа. Второй (мы будем использовать его) - рисование в памяти растровой картинки с выводом числа прямо на ней. Как мы этого добьемся? Для начала создаем растровое изображение (компонент Image), а для рисования на нем используем стандартные методы класса TCanvas. Далее мы подключаем это изображение к объекту класса TJpegImage, чтобы получить изображение в формате jpeg. После этого можно сохранить полученные данные в поток и вернуть их клиенту.

Механизм же реализации счетчика еще проще: при обращении клиента к программе осуществляется проверка на наличие лог-файла с числом посещений. Если файл существует, то программа просто добавляет единицу и перезаписывает файл; если же его нет, то в файл пишется единица (так как мы все же обратились к странице один раз). А дальше осуществляется подготовка изображения и отправка его клиенту.

За пересылку изображения клиенту отвечают три выражения:

Response.ContentType := 'image/jpeg'; - задает тип содержимого ответа;

Response.ContentStream := Stream; - присваивает поток свойству ContentStream;

Response.SendResponse; - отправляет ответ клиенту.

Теперь для проверки работоспособности приложения ты можешь обратиться к нему так: www.somehost.ru/cgi-bin/Project1, или вставить в нужную тебе страницу тег <img src="путь_к_скрипту">.

Заключение

И последнее. При написании серверных приложений каждый сталкивался с проблемой их отладки. Но у тех, кто использует Delphi таких проблем больше не будет: начиная с 6 версии появился встроенный отладчик Web App Debugger. Подробно рассказывать о нем не буду, но если возникнут вопросы, смело присылай их мне.

Вот и все. Теперь у тебя есть начальные знания, необходимые для написания серверного приложения на Delphi.

Удачи!

Листинг счетчика

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

var

Bitmap: TBitmap;

Hits: Integer;

LogFile: Text;

FileName: string;

Jpeg1: TJpegImage;

Stream: TMemoryStream;

begin

FileName :='Count.log'; //задаем название лог-файла

System.Assign(LogFile, FileName);

try

if FileExists(FileName) then //если файл существует, то добавляем 1 к общему числу посещений

begin

Reset(LogFile);

Readln(LogFile, Hits);

Inc(Hits);

end

else //если нет, то пишем в файл 1

Hits := 1;

Rewrite(LogFile);

Writeln(LogFile, Hits);

finally

Close(LogFile);

end;

Bitmap := TBitmap.Create; //создаем изображение

try

Bitmap.Width := 120;

Bitmap.Height := 25;

Bitmap.Canvas.Font.Name := 'Arial';

Bitmap.Canvas.Font.Size := 14;

Bitmap.Canvas.Font.Color := RGB (255, 127, 0);

Bitmap.Canvas.Font.Style := [fsBold];

Bitmap.Canvas.TextOut (1, 1, 'Hits: ' + FormatFloat ('###,###,###', Int(Hits))); //выводим количество посещений

Jpeg1 := TJpegImage.Create;

try

Jpeg1.CompressionQuality := 50;

Jpeg1.Assign(Bitmap);

Stream := TMemoryStream.Create; //создаем поток

Jpeg1.SaveToStream (Stream); //помещаем в него изображение

Stream.Position := 0;

Response.ContentType := 'image/jpeg';

Response.ContentStream := Stream;

Response.SendResponse; //отсылаем результат

finally

Jpeg1.Free;

end;

finally

Bitmap.Free;

end;

end;



Опубликовал admin
20 Янв, Вторник 2004г.



Программирование для чайников.