Чтение онлайн

на главную - закладки

Жанры

Шрифт:

• Active – активизирует или деактивизирует сервер (по умолчанию False);

• Bindings – настраивает серверные сокеты (присоединяет их к определенному порту компьютера, позволяет задавать диапазон IP-адресов и портов клиентов) при помощи диалогового окна Binding Editor;

• ListenQueue – численное значение, ограничивающее максимальное количество запросов на установление соединения от клиентов в очереди;

• MaxConnections – позволяет ограничить максимальное количество клиентов, присоединенных к серверу;

• MaxConnectionReply – позволяет настроить сообщение, посылаемое сервером новым клиентам, когда их количество достигает MaxConnections.

Рассмотрим несколько подробнее настройку серверных

гнезд с использованием свойства Bindings. Так, на рис. 11.1 показано, как при помощи диалогового окна Binding Editor настроить сервер на обслуживание клиентов с любыми IP-адресами, при этом серверный сокет присоединяется к порту 12340.

Рис. 11.1. Использование окна Binding Editor

Для более детальной настройки каждого серверного сокета можно использовать окна Object TreeView и Object Inspector так, как показано на рис. 11.2.

Рис. 11.2. Настройка серверного гнезда

На этом настройку сервера можно и завершить (хотя здесь используются далеко не все возможности компонента IdTCPServer). Основная же работа сервера при обработке запросов клиентов может реализоваться в обработчике события OnExecute. В этот обработчик передается ссылка на o6beKTTIdPeerThread – поток, ассоциированный с клиентом, присоединенным к серверу. Посредством этого объекта (а точнее, его свойства Connection) можно получать и отправлять данные, а также получать и устанавливать множество полезных параметров соединения. Первый пример использования объекта TIdPeerThread при обработке запроса клиента приведен в листинге 11.1.

Теперь рассмотрим, как сконфигурировать клиент (IdTCPQient), чтобы он был способен взаимодействовать с нашим сервером. Чтобы использовать компонент ТСР-клиента, достаточно поместить его на форму (компонент также неотображаемый).

После этого как минимум нужно настроить следующие его свойства (остальные упоминаются по мере необходимости в приведенных далее примерах):

• Host – имя или IP-адрес компьютера, на котором запущен сервер;

• Port – номер порта, к которому присоединен серверный сокет.

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

11.2. Простой обмен данными

В начале работы с описанными в предыдущем разделе компонентами IdTCPServer и IdTCPChent рассмотрим создание несложного клиент-серверного приложения, клиентская и серверная части которого выполняют следующие функции.

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

• Серверное приложение принимает строку от клиентского приложения и посылает ответ (также текстовый), после чего разрывает соединение. Плюс к этому ведется подсчет количества обслуженных клиентов и запоминается IP-адрес компьютера, с которого пришел последний запрос.

Реализация как серверного, так и клиентского приложений в нашем случае предельно проста. Проект серверного приложения Ha3biBaeTCflSimpleServer. Внешний вид формы сервера (во время работы приложения) представлен на рис. 11.3.

Рис. 11.3. Внешний вид простого сервера

Текстовое поле (Edit) с количеством обработанных запросов имеет имя txtCount,

а текстовое поле с адресом последнего обслуженного компьютера названо txtFrom. Вся работа сервера заключается в обработке события Execute для компонента IdTCPServer, помещенного на форму (присоедините этот компонент к порту 12340 и установите значение свойства Active = True) (листинг 11.1).

...

Листинг 11.1. Реализация простого сервера

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);

var

strText: string;

begin

//Принимаем от клиента строку

strText := AThread.Connection.ReadLn;

//Отвечаем

AThread.Connection.WriteLn(\'Принял строку:\' + strText);

//Обновим сведения на форме сервера (сервер многопоточный,

//поэтому используем синхронизацию)

section.Enter;

Inc(processed,1);

txtCount.Text := IntToStr(processed);

txtFrom.Text := AThread.Connection.Socket.Binding.PeerIP;

section.Leave;

//Закрываем соединение с пользователем

AThread.Connection.Disconnect;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

section := TCriticalSection.Create;

end;

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

Анализируя листинг 11.1, можно заметить, что даже в рассматриваемом простейшем сервере пришлось применить синхронизацию при обновлении внешнего вида формы при помощи критической секции (необходимо дополнительно добавить имя модуля SyncObjs в секцию uses).

Теперь рассмотрим реализацию клиентской части (проект SimpleClient). Внешний вид клиентского приложения приведен на рис. 11.4.

Рис. 11.4. Внешний вид клиента

Естественно, что для работы клиентского приложения на форму помещен экземпляр компонента IdTCPQient (его имя – IdTCPClientl). Свойству Port этого компонента нужно присвоить значение 12 34 0. Текстовое поле (Edit) для ввода строки, подлежащей отправке не сервер, имеет HMfltxtMessage. Текстовое поле (Edit), в которое вводится имя или адрес сервера, названо txtServer. Поле со строками ответов (Memo) имеет имя txtResults. Вся работа клиентского приложения выполняется при нажатии кнопки Обработать. Текст соответствующего обработчика приведен в листинге 11.2.

...

Листинг 11.2. Реализация простого клиента

procedure TForm1.Button1Click(Sender: TObject);

begin

//Соединяемся с сервером и посылаем ему введенную строку

IdTCPClient1.Host := txtServer.Text;

IdTCPClient1.Connect;

IdTCPClient1.WriteLn(txtMessage.Text);

txtMessage.Text := \'\

//Ожидаем ответ и закрываем соединение

txtResults.Lines.Append(IdTCPClient1.ReadLn);

IdTCPClient1.Disconnect;

end;

...

Примечание

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

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

Поделиться:
Популярные книги

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Мастер порталов

Лисина Александра
8. Гибрид
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер порталов

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Законы Рода. Том 12

Андрей Мельник
12. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 12

Бояръ-Аниме. Газлайтер. Том 33

Володин Григорий Григорьевич
33. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 33

Неудержимый. Книга V

Боярский Андрей
5. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга V

Двойник короля 20

Скабер Артемий
20. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 20

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Изгои

Владимиров Денис
5. Глэрд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Изгои

Имя нам Легион. Том 15

Дорничев Дмитрий
15. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 15

Император Пограничья 8

Астахов Евгений Евгеньевич
8. Император Пограничья
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 8