Функции и процедуры
Клиент
Функция получения своего айпи:
function TForm1.GetLocalIP: String;
Процедура запроса погоды, клиентом:
procedure TForm1.Button1Click(Sender: TObject);
Процедура получения пакета клиентом:
procedure TForm1.sUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
Процедура, таймер проверки связи с сервером:
procedure TForm1.Timer1Timer(Sender: TObject);
Процедура, таймер проверки был ли получен ответ от сервера в установленное время
procedure TForm1.Timer2Timer(Sender: TObject);
Процедура установка начальный параметров клиента:
procedure TForm1.FormCreate(Sender: TObject);
Процедура управления формой:
procedure TForm1.Button3Click(Sender: TObject);
Сервер
Функция получения своего айпи:
function TForm1.GetLocalIP: String;
Процедура установка начальный параметров клиента:
procedure TForm1.FormCreate(Sender: TObject);
Процедура анализа полученного пакета и соответствующего ответа:
procedure TForm1.sUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
Интерфейс
Форма сервера:
Форма клиента:
Код программы клиента:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,IdSocketHandle, StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdUDPBase, IdUDPClient, ExtCtrls,
IdUDPServer, IdTCPServer, jpeg, Buttons, FileCtrl,WinSock;
type
TForm1 = class(TForm)
Button1: TButton;
s: TIdUDPServer;
c: TIdUDPClient;
Eip: TEdit;
Timer1: TTimer;
Timer2: TTimer;
Memo1: TMemo;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Eip2: TEdit;
Label5: TLabel;
Eport: TEdit;
Button2: TButton;
Button3: TButton;
Bevel1: TBevel;
procedure Button1Click(Sender: TObject);
procedure sUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure s2UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
function GetLocalIP: String;
{ Private declarations }
public
{ Public declarations }
Mip:string;
ncs:byte;
end;
var
Form1: TForm1;
numP: byte;
implementation
{$R *.dfm}
function TForm1.GetLocalIP: String;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P := GetHostByName(@Buf);
if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
c.Port:=strtoint(eport.text);
c.Active:=true;
c.Send('z'+ GetLocalIP);
c.Active:=false;
end;
procedure TForm1.sUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
i : integer;
mas : array [0..1000] of char;
str,pg : string;
begin
if numP<>0 then
begin
if ncs=1 then
Memo1.Lines.Add('Подключение к серверу 1 востановленно')
else
Memo1.Lines.Add('Подключение к серверу 2 востановленно');
end;
numP:=0;
timer2.Enabled:=false;
Adata.Read(mas,100);
for i:=0 to 1000 do
begin
if mas[i]<>'' then
str:=str+mas[i]
else
break;
end;
if mas[0]='z' then
begin
if mas[1]='d' then Image1.Picture.LoadFromFile('d.jpg');
if mas[1]='p' then Image1.Picture.LoadFromFile('p.jpg');
if mas[1]='s' then Image1.Picture.LoadFromFile('s.jpg');
if mas[1]='o' then Image1.Picture.LoadFromFile('o.jpg');
for i:=2 to 1000 do
begin
if mas[i]<>'#' then
pg:=pg+mas[i]
else
break;
end;
label1.Caption:=pg;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//c.Host:=eip.Text;
c.Port:=strtoint(eport.text) ;
c.Active:=true;
c.Send('p'+Mip+'!' );
c.Active:=false;
timer2.Enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if numP=0 then
begin
if ncs=1 then
Memo1.Lines.Add('Потерянна связь с сервером 1. Попытка подключения ¹1')
else
Memo1.Lines.Add('Потерянна связь с сервером 2. Попытка подключения ¹1');
end;
if numP=1 then
begin
if ncs=1 then
Memo1.Lines.Add('Потерянна связь с сервером 1. Попытка подключения ¹2')
else
Memo1.Lines.Add('Потерянна связь с сервером 2. Попытка подключения ¹1');
end;
if numP>1 then
begin
timer2.Enabled:=false;
if ncs=1 then
begin
c.Host:=eip2.Text;
ncs:=2;
numP:=0;
Memo1.Lines.Add('Потерянна связь с сервером 1. Попытка подключения ко второму');
end
else
begin
c.Host:=eip.Text ;
ncs:=1;
numP:=0;
Memo1.Lines.Add('Потерянна связь с сервером 2. Попытка подключения к первому');
end;
end;
numP:=numP+1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
s.DefaultPort:=strtoint(eport.Text)
end;
procedure TForm1.s2UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
i : integer;
mas : array [0..1000] of char;
str : string;
begin
Adata.Read(mas,100);
for i:=0 to 1000 do
begin
if mas[i]<>'' then
str:=str+mas[i]
else
break;
end;
timer2.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Mip:=GetLocalIP;
c.Host:=eip.Text;
numP:=0;
ncs:=1;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Button3.caption='Скрыть настройки' then
begin
label2.Visible:=false;
label3.Visible:=false;
label4.Visible:=false;
label5.Visible:=false;
eip.Visible:=false;
eip2.Visible:=false;
eport.Visible:=false;
Button2.Visible:=false;
Memo1.Visible:=false;
Form1.Height:=180;
button3.Caption:='Показать настройки';
end
else
begin
label2.Visible:=true;
label3.Visible:=true;
label4.Visible:=true;
label5.Visible:=true;
eip.Visible:=true;
eip2.Visible:=true;
eport.Visible:=true;
Button2.Visible:=true;
Memo1.Visible:=true;
Form1.Height:=400;
Button3.caption:='Скрыть настройки';
end
end;
end.
