Разработка клиент-серверных приложений с использованием Indy в Delphi

Cети и Интернет   1 Январь 2012  Автор статьи: admin 

Indy — это достаточно мощный пакет компонентов, позволяющий разрабатывать различные сетевые приложения. В этом уроке я расскажу вам о том, как можно создавать клиент-серверные приложения при помощи компонентов TIdTCPClient и TIdTCPServer.

Прежде всего хочется отметить два важных преимущества этих компонентов. Самое главное из них — это многопоточность, которая заключается в том, что для каждого клиента сервер создает отдельный поток, и это безусловно влияет на быстродействие серверной программы на компьютерах с многоядерным процессором. Второе из преимуществ — это простота использования. Достаточно 10-20 строчек кода, чтобы написать простейшее клиент-серверное приложение. Данный пакет компонентов присутствует в стандартных сборках Delphi.

Напишем простую программу, позволяющую передавать текстовое сообщение от клиента к серверу. Приступим к созданию сервера.
Поместим на форму компонент IdTCPServer со вкладки «Indy Servers». Все настройки этого компонента мы проведем в runtime в событии OnCreate формы:

1
2
IdTCPServer1.DefaultPort := 12345;
IdTCPServer1.Active := true;

Здесь все просто — указываем порт, на котором будет работать сервер, и активируем сам сервер.

Для того, чтобы получать данные на сервере от клиента, существует специальное событие «OnExecute». Выглядит это событие следующим образом:

1
2
3
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
begin
end;

Отредактируем содержимое события следующим образом:

1
2
3
4
5
6
7
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
  l: string; // строковая переменная, в которую мы будем получать
begin
  l := AContext.Connection.IOHandler.ReadLn();
  Memo1.Lines.Add(l);
end;

Теперь, как только на сервер будет поступать сообщение, мы будем его записывать в строковую переменную l и выводить в многострочное текстовое поле.

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

Создадим новый проект, поместим на форме компонент IdTCPClient, который можно найти на вкладке «Indy Clients». Также поместим простой Edit и кнопку. Создадим для кнопки обработчик события OnClick, внутри которого напишем:

1
2
3
4
5
  IdTCPClient1.Port := 12345;
  IdTCPClient1.Host := '127.0.0.1';
  IdTCPClient1.Connect;
  IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
  IdTCPClient1.Disconnect;

[note]Данный код не обязательно помещать в событие OnCreate. На ваше усмотрение вы можете поместить этот код куда угодно.[/note]
В первой строке мы присваиваем порт, при чем необходимо указать такой же порт, какой мы указали на серверной программе, иначе клиент просто не найдет сервер. Затем указываем IP адрес сервера. Сам сервер может находиться как в локальной сети, так и удаленно. В последнем случае соединение будет произведено посредством сети Интернет и указывать нужно будет IP адрес в сети Интернет.

[note]Я указал адрес «127.0.0.1», что говорит о том, что сервером и является компьютер на котором запущен клиент. Такой способ очень удобен для тестирования сетевых приложений.[/note]
Затем мы производим подключение, отправляем сообщение и отключаемся.Также как и само сообщение, IP адрес вы можете брать тоже из Edit или из любой строковой переменной.

Работа над клиентской программой тоже закончена. Как видите, Indy делает за нас колоссальную работу, что дает возможность даже неопытному программисту создать свое сетевое приложение.

  • Гость

    Хорошая статья для понимания начал.

  • Гость

    Хорошая статья для понимания начал.

  • Александр

    Я попробовал работу данной программы. Если работать на одном своем компе, то вроде все нормально — сообщения от клиентской программы хорошо доходят до серверной. Но вот когда я решил проверить ее работоспособность в сети интернет, посылая сообщения на другой комп, то начались проблемы. Я ввожу верный IP адрес (или его имя) компа сервера, но сообщение не отсылается — появляется ошибка Socket error 10060. Connection time out. Понятно, что вышло время ожидания соединения, но что надо делать в таком случае?

Научиться программировать

  • на Delphi

  • на Java

  • на C++