Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
7.98 Mб
Скачать

2. Задание по практическому занятию

Создаваемое на занятии приложение работает следующим образом:

  • передача данных является односторонней: от клиента к серверу;

  • если данное приложение работает как клиент, то при нажатии кнопки «Передать» приложение считывает содержимое многострочного компонента Меmо2 и передает все строки серверу;

  • если данное приложение работает как сервер, то для обработки получаемой or клиента информации создается дополнительный поток TclientDataThread.

Для передачи данных по сета необходимо выполнить следующие пункты:

  1. Создайте приложение, изображенное на рис. 1.

  2. Установите на форме следующие компоненты:

  • TcpClient (страница Internet Палитры компонентов);

  • TcpServer (страница Internet Палитры компонентов);

  • Label1 - «Удаленный адрес»;

  • Label2 - «Удаленный порт»;

  • Label3 - «Локальный адрес»;

  • I.abel4 - «Локальный порт»;

  • Edit1 - окно ввода удаленного адреса;

  • Edil2 - окно ввода удаленного порта;

  • Edit3 - окно ввода локального адреса;

  • Edit4 - окно ввода локального порта;

  • Button1 - кнопка «Запустить сервер»;

  • Button2 - кнопка «Передать»;

  • Memo1 - окно редактирования Memo для вывода на экран переданной от клиента строки;

  • Memo2 - окно редактирования Memo для ввода передаваемой на сервер строки.

Рис 1

3) Для обработки передаваемой от клиента информации необходимо создать поток TClientDataThread.

Описание структуры создаваемого потока выполняется перед разделом Var (var Form1: TForm1;) и имеет следующий вид:

TClientDataThread=class(TThread)

private

public

ListBuffer: TStringList;

TargetList: TStrings;

procedure synchAddDataToControl;

constructor Create(CreateSuspended: Boolean);

procedure Execute; override;

procedure Terminate;

end;.

4) Процедуры, входящие в новый поток, описываются в начале блока implementation:

implementation

{$R*.dfm}

//---------------Описание нового потока--------------------

constructor TClientDataThread.Create(CreateSuspended: Boolean);

begin

inherited Create(CreateSuspended);

FreeOnTerminate:= true;

ListBuffer:= TStringList.Create;

end;

procedure TClientDataThread.Terminate;

begin

ListBuffer.Free;

inherited;

end;

procedure TClientDataThread.Execute;

begin

Synchronize(synchAddDataToControl);

end;

procedure TClientDataThread.synchAddDataToConlrol;

begin

TargetList.AddStrings(ListBuffer);

end;

//-------------описание клиентского потока окончено------------------

5) Для события OnCreate формы Form1 следует записать программный код:

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Clear;

Memo2.Clear;

Edit1.Text:='127.0.0.1’;

Edit3.Text := '127.0.0.1';

Edit2.Texl := '5000';

Edit4.Text := '5000';

TcpClient1.BlockMode := bmBlocking;

TcpServer1.BlockMode := bmThreadBlocking;

end;.

6) Для события OnClick кнопки «Запустить сервер» следует записать программный код:

procedure TForm1.Button1Click(Sender: TObject);

begin

TcpServer1.LocalPort:=Edit4.Text;

TcpServer1.Active := True;

end;.

  1. Для события OnClick кнопки «Передать» следует записать программный код:

procedure TForm1 .Button2Click(Sender: TObject);

var

1: Integer;

begin

TcpClient1.RemoteHost := Edit1.Text;

TcpClient1.RemotePort := Edit2.Text;

Try

// Последовательная передача в блокирующем режиме всех строк

// окна Memo2

if TcpClient1.Connect then

for l:= 0 to Memo2.Lines.Count-l do

TcpClient1.Sendln(Memo2.Lines[l]);

finally

TcpClient1.Disconnect;

end;

end;.

8) Для события onAccept компонента TcpServer следует записать программный код:

procedure TForm1.TcpServer1Aceept(Sender: TObject);

ClientSocket: TCustomlp(Client);

var

s: string:

DataThread: TClientDataThread;

begin

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

DataThread:= TClientDataThread.Create(true);

// Установить указатель на начало списка

DataThread.TargetList := Memo1.lines;

// Запись в буфер потока

DataThread.ListBuffer.Add(‘*** Соединение произошло ***');

DataThread.ListBuffer.Add('Удаленный xocт:'+

ClientSocket.LookupHostName(ClientSocket.RemoteHost)+

' (' + ClientSocket.RemoteHost +')');

DataThread.ListBuffer.Add(‘-----Начало сообщения-----');

s := ClientSocket.Receiveln;

while s<>" do

begin

DataThread.ListBuffer.Add(s);

s := ClientSocket.Receiveln;

end;

DataThread.ListBuffer.Add('------ Конец сообщения ------‘);

// запустить поток для вывода на экран сообщений клиента DataThread.Resume:

end;.

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

Запустите два экземпляра приложения, одно из которых будет сервером, а другое клиентом. Настройки сервера показаны на рис. 2. Нажмите кнопку «Запустить сервер».

Рис. 2

Настройки клиента показаны на рис. 3.

Рис. 3

Выполните прием-передачу данных.

ЛИТЕРАТУРА

1. Джонс Э., Оланд Дж. Программирование в сетях MicrosoftWindows. Мастер-класс /Пер. с англ. М.. Издательско-торговый дом «Русская редак­ция», 2002. 608 с.

2. Дарахвелидзе П.Г., Марков Е.П. Разработка Web-служб средствами Delphi. СПб., БХВ-Петербург. 2003. 672 с.

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Опишите основные свойства компонента TcpClient.

  2. Опишите основные свойства компонента TcpServer.

  3. Опишите события, на которые реагирует компонент TcpClient.

  4. Опишите события, на которые реагирует компонент TcpServer.

  5. Чем блокирующий режим отличается от неблокирующего?

  6. Для чего необходимо создавать дополнительные потоки на сервере?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]