Delphi. Учимся на примерах - [33]

Шрифт
Интервал

Для того чтобы на сервере не возникало ошибок при аварийном выключении клиента, создайте обработчик события формы OnDestroy и добавьте в него следующий код:

>procedure TForm1.FormDestroy(Sender: TObject);

>begin

> Client.Close; //закрываем соединение

> Client.Active:=False; //отключаемся от сервера

>end;

При аварийном завершении программы закрывается соединение и выполняется отключение от сервера.

Для уведомления пользователя об успешном соединении с сервером создайте обработчик события client.OnConnect:

>procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

>begin

ShowMessage('Connected!'); //показать сообщение

>end;

Для реализации аналогичного действия при отсоединении от сервера, следует создать обработчик события OnDisconnect:

>procedure TForml.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

>begin

> ShowMessage('Disconnected!'); //сообщение при отсоединении

>end;

Теперь обработаем событие OnTimer для компонента Timer:

>procedure TForm1.Timer1Timer(Sender: TObject);

>var

> cur:TPoint; //хранит координаты указателя мыши

>begin

> GetCursorPos(cur); //узнаем координаты указателя мыши

> //отправляем данные на сервер

> Client.Socket.SendText(IntToStr(cur.X) +'_' + IntToStr(cur.Y));

>end;

Каждые полсекунды мы будем получать координаты указателя мыши и отправлять их на сервер. Программа-клиент полностью готова. Теперь разработаем программу-сервер.

Разработка серверной программы

Создайте новый проект Delphi. Разместите на форме главный компонент программы — ServerSocket категории Internet и измените значение его свойства Port на 2801.

Первым делом, обеспечим нашей форме невидимость. Создайте обработчик события формы OnPaint и добавьте в него следующий код:

>procedure TForm1.FormPaint(Sender: TObject);

>begin

> Form1.Hide;

>end;

Для того чтобы активизировать сервер при запуске программы, необходимо обработать событие формы OnCreate:

>procedure TForm1.FormCreate(Sender: TObject);

>begin

> ServerSocket1.Active:= True; //активизировать сервер

>end;

Для того чтобы при выходе из программы сервер отключался, необходимо обработать событие формы OnDestroy:

>procedure TForm1.FormDestroy(Sender: TObject);

>begin

> ServerSocket1.Active:= False; //отключаем сервер

>end;

Теперь осталось только обработать событие OnClientRead компонента ServerSocket. Это событие будет происходить каждый раз, когда будет поступать команда от клиента. Код обработчика этого события имеет следующий вид:

>procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

>var

str, x, y: string; //полученный текст и координаты

>  //указателя по X и по Y

i, j: integer; //счетчики циклов

begin

> //обнуляем координаты курсора

> х := ' ';

> у := ' ';

> str:= Socket.ReceiveText; //полученный от клиента текст

> for i:=1 to Length(str) do begin

>  if str[i] <> '_' then x:= x + str[i]; //координаты по х

>  if str[i] = '_' then Break; //разделитель между

>   //координатами указателя

end;

> for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у

> //устанавливаем новые координаты указателя

SetCursorPos(StrToInt(x), StrToInt(у));

>end;

При получении текста мы считываем в отдельные переменные значение координат указателя по X и по Y. Затем изменяем координаты на те, которые только что получили от клиента.

Теперь программа полностью готова, и для того чтобы протестировать ее, необходимо иметь хотя бы два компьютера, объединенные в локальную сеть или подключенные к Internet.

Полный исходный код модулей

Полный код модуля серверной программы представлен в листинге 16.1.

Листинг 16.1. Модуль серверной программы

>unit Unit1;


>interface


>uses

> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp;


>type TForm1 = class(TForm)

> ServerSocket1: TServerSocket;

> procedure FormDestroy(Sender: TObject);

> procedure FormCreate(Sender: TObject);

> procedure ServerSocketlClientRead(Sender: TObject; Socket: TCustomWinSocket);

> procedure FormPaint(Sender: TObject);

>private

> { Private declarations }

>public

> { Public declarations }

>end;


>var

> Form1: TForm1;


>implementation

>{$R *.dfm}


>procedure TForm1.FormDestroy(Sender: TObject);

>begin

> ServerSocket1.Active:= False; //отключаем сервер

>end;


>procedure TForm1.FormCreate(Sender: TObject);

>begin

> ServerSocket1.Active:= True; //активизировать сервер

>end;


>procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

>var

> str, x, y: string; //полученный текст и координаты

>  //указателя по X и по Y

> i, j: integer; //счетчики циклов

> begin

> //обнуляем координаты курсора

> х := ' ';

> у := ' ';

> str:= Socket.ReceiveText; //полученный от клиента текст

> for i:=1 to Length(str) do begin

>  if str[i] <> '_' then x:= x + str[i]; //координаты по х

>  if str[i] = '_' then Break; //разделитель между

>   //координатами указателя

> end;

> for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у

> //устанавливаем новые координаты указателя

> SetCursorPos(StrToInt(x), StrToInt(у));

>end;


>procedure TForm1.FormPaint(Sender: TObject);

>begin

> Form1.Hide;

>end;


>end.

Полный код модуля клиентской программы представлен в листинге 16.2.

Листинг 16.2. Модуль клиентской программы

>unit Unit1;


>interface


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.