KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Сергей Парижский - Delphi. Учимся на примерах

Сергей Парижский - Delphi. Учимся на примерах

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Сергей Парижский, "Delphi. Учимся на примерах" бесплатно, без регистрации.
Перейти на страницу:

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

Разработка программного кода

По нажатию кнопки Connect должны считываться все настройки и выполняться соединение с сервером:

procedure TForm1.Button1Click(Sender: TObject);

begin

 Client.Port:= StrToInt(port.Text); //считываем порт

 Сlient.Address:= ip.text; //считываем ip-адрес сервера

 Client.Active:= True; //соединяемся

 Timer1.Enabled:= True; //включаем таймер

end;

Сначала мы считываем все необходимые настройки, а затем предпринимаем попытку соединиться с сервером. Если все нормально, то включаем таймер, по которому будут передаваться координаты указателя мыши.

Обработаем нажатие кнопки Disconnect:

procedure TForm1.Button2Click(Sender: TObject);

begin

 Timer1.Enabled:= False;//выключаем таймер

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

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

end;

При нажатии кнопки Disconnect мы перестаем передавать координаты указателя на сервер и отсоединяемся от него.

Для того чтобы на сервере не возникало ошибок при аварийном выключении клиента, создайте обработчик события формы 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


uses

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


type TForm1 = class(TForm)

 Button1: TButton;

 Button2: TButton;

 Client: TClientSocket;

 Timer1: TTimer;

 port: TEdit;

 ip: TEdit;

 Label1: TLabel;

 Label2: TLabel;

 procedure Button2Click(Sender: TObject);

 procedure FormDestroy(Sender: TObject);

 procedure Button1Click(Sender: TObject);

 procedure Timer1Timer(Sender: TObject);

 procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

 procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

private

 { Private declarations }

public

 { Public declarations }

end;


var

 Form1: TForm1;


implementation

{$R *.dfm}


procedure TForm1.Button2Click(Sender: TObject);

begin

 Timer1.Enabled:= False;//выключаем таймер

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

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

end;


procedure TForm1.FormDestroy(Sender: TObject);

begin

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

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

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 Client.Port:= StrToInt(port.Text); //считываем порт

 Сlient.Address:= ip.text; //считываем ip-адрес сервера

 Client.Active:= True; //соединяемся

 Timer1.Enabled:= True; //включаем таймер

end;


procedure TForm1.Timer1Timer(Sender: TObject);

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*