Domovská stránka Programovanie v C++ Kontakt
  10. Sieť

Na prednáške:

Úvod

Pri komunikácií budeme používať protokol TCP/IP = Transmission Control Protocol / Internet Protocol.

Komunikácia prebieha v režime klient-server:

Na posielanie a prijímanie údajov budem používať komponenty zo záložky Internet:
  TServerSocket,
  TClientSocket
.
Socket - zásuvka, internetová prípojka. Prostredníctvom "soketov" posielame alebo prijímame údaje.

Významné vlastnosti a udalosti komponentov:

TClientSocket TServerSocket význam:
Address   IP adresa servera
Host   textom popísaná adresa
Port Port komunikačný port
Actvie Active či je spojenie aktivované
OnRead   ak server poslal správu
  OnClientConnect ak sa klient pripojil
  OnClientDisconnect ak sa klient odpojil
  OnClientRead ak klient poslal správu

Komponenty TServerSocket a TClientSocket sú iba obálkou pre iný objekt, ktorý v sebe obsahujú:

Komponenty zapuzdrujú objekt Socket tak, aby sa nám pomocou Inšpektora objektov v Delphi dobre s komponentmi pracovalo.

Triedy TClientWinSocket a TServerWinSocket sú odvodené od triedy TCustomWinSocket. Preto objekt Socket umožňuje:

Socket.SendText poslanie textovej správy
Socket.SendBuf poslanie binárnych údajov
Socket.ReceiveText prijatie textovej správy
Socket.ReceiveBuf prijatie binárnych údajov

Okrem toho, objekt TServerWinSocket udržiava zoznam pripojených klientov a poskytuje metódy na posielanie údajov klientom:

Socket.ActiveConnections počet pripojených klientov
Socket.Connections pole s pripojenými klientmi prvky sú typu TCustomWinSocket
Socket.Connections[I].SendText poslanie textovej správy I-temu klientovi
Socket.Connections[I].SendBuf poslanie binárnych údajov I-temu klientovi

Nadviazanie spojenia

1. Predovšetkým vytvoríme aplikáciu, ktorá sa bude vystupovať v úlohe servera:

Program vypíše do Mema1 správu o pripojení alebo odpojení klienta. Ďalej umožní prijímať textové správy od klientov a poslať všetkým klientom jednoduchú textovú správy, ktorú používateľ napíše do komponentu Edit1.

procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);    // OnClientConnect
begin
  Memo1.Lines.Add('Connected: '+Socket.RemoteHost);
end;

procedure TForm1.ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); // OnClientDisconnect
begin
  Memo1.Lines.Add('Disconnected: '+Socket.RemoteHost);
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  Index: Integer;
begin
 
if Key<>VK_RETURN then Exit;
 
for Index:=0 to Server.Socket.ActiveConnections-1 do
    Server.Socket.Connections[Index].SendText(Edit1.Text);
  Edit1.Text:='';
  Key:=0;
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);       // OnClientRead
begin
  Memo1.Lines.Add(Socket.RemoteHost+': '+Socket.ReceiveText);
end;

 2. Potom vytvoríme aplikáciu, ktorá vystupuje v úlohe klienta (alebo viacerých klientov):

Pri stlačení klávesu Enter sa pošle text:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 
if Key<>VK_RETURN then Exit;
  Client.Socket.SendText(Edit1.Text);
  Edit1.Text:='';
  Key:=0;
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);             // OnRead
begin
  Memo1.Lines.Add(Socket.RemoteHost+': '+Socket.ReceiveText);
end;

3. Najskôr spustíme aplikáciu servera a až potom môžeme spúšťať aplikácie klientov.

Posielanie binárnych údajov

Vytvoríme jednoduchý sieťový kresliaci program, ktorý umožní všetkým účastníkom kresliť do grafickej plochy krúžky. Kresba sa bude zobrazovať všetkým účastníkom zároveň. Navyše sa naučíme používať iba jeden projekt (jeden exe program), ktorý môže fungovať aj ako server aj ako klient zároveň. V programe používame používame komponenty:


Vo formulári máme položené komponenty Image a sokety Client a Server.

Program:

procedure TForm1.FormCreate(Sender: TObject);
var
  IP: string;
begin
  IP:=InputBox('IP Adresa', 'Zadaj IP adresu servera:', '');
 
if IP='' then IP:='127.0.0.1';
 
try
    Server.Active:=True;
 
except
 
end;
  Client.Address:=IP;
  Client.Active:=True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  Data: TPoint;
begin
 
if not (ssLeft in Shift) then Exit;
  Data.X:=X;
  Data.Y:=Y;
  Client.Socket.SendBuf(Data, SizeOf(Data));
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Data: TPoint;
  Index: Integer;
begin
  Socket.ReceiveBuf(Data, SizeOf(Data));
 
for Index:=0 to Server.Socket.ActiveConnections-1 do
    Server.Socket.Connections[Index].SendBuf(Data, SizeOf(Data));
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Data: TPoint;
begin
  Socket.ReceiveBuf(Data, SizeOf(Data));
  Image1.Canvas.Brush.Color:=clRed;
  Image1.Canvas.Ellipse(Data.X-5, Data.Y-5, Data.X+5, Data.Y+5);
end;

Celý program

V programe:

Klient funguje ako terminál - zbiera vstup od používateľa a posiela ho serveru a výsledky, ktoré získa od servera zobrazuje na obrazovke. Server pracuje ako centrálny komunikačný uzol.

Jednoduchá sieťová hra

Motorky bude hra pre niekoľkých hráčov po sieti. Každý hráč ovláda svoju motorku, ktorá za sebou zanecháva stopu. Do nej nesmie žiaden z hráčov naraziť (ani ten, ktorého motorka zanechala stopu). Vyhráva hráč, ktorý dokáže jazdiť na motorke najdlhšie.

Podobne, ako v predchádzajúcej úlohe aj tu klienti pracujú ako terminály a server sa stará o spracovanie, vyhodnotenie zapamätanie a distribúciu údajov.

Program sa skladá zo 4 unitov:

Po sieti sa posielajú tri druhy údajov - správ (viď. NetMsg.pas):

Server bude využívať objekt Manager a objekty Player. Bude sa starať o:

Klient bude:

Celý program

© 2015 Ľ. SALANCI