...

Листинг 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.

Загрузка...