Na prednáške:
- úvod do sieťovej komunikácii pomocou TCP/IP,
- nadviazanie sieťového spojenia medzi počítačmi, posielanie textov a zložitejších údajov,
- jednoduchá sieťová aplikácia.
Úvod
Pri komunikácií budeme používať protokol TCP/IP = Transmission Control Protocol / Internet Protocol.
Komunikácia prebieha v režime klient-server:
- Server je niečo (aplikácia, počítač, komponent), čo poskytuje služby a funkcie. Ďalej:
- server obsluhuje požiadavky klientov,
- k jednému serveru môžu byť pripojení aj viacerí klienti.
- Klient je ten, kto využíva službu servera. Ďalej:
- klient sa pripája k serveru,
- klient môže byť pripojený maximálne k jednému serveru.
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ú:
- TServerSocket v sebe zapuzdruje objekt Socket triedy
TServerWinSocket.
- TClientSocket v sebe zapuzdruje objekt Socket triedy
TClientWinSocket.
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:
- do formulára vložíme TServerSocket,
- vlastnosť Name=Server ... komponent premenujeme zo
ServerSocket1 na Server,
- vlastnosť Port=51,
- vlastnosť Active=true.
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):
- do formulára vložíme TClientSocket.
- do vlastnosť Address nastavíme IP adresu toho počítača, na ktorom
beží predchádzajúca aplikácia so serverom - ak server spúšťame na na tom istom počítači (napríklad kvôli testovaniu), môžeme
Address=127.0.0.1 (alebo vlastnosť Host=localhost),
- vlastnosť Name=Client ... komponent premenujeme z
ClientSocket1 na Client,
- vlastnosť Port=51,
- vlastnosť Active=true.
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;
- IP adresa je štvorica 8 bitových čísel, ktoré identifikujú počítač v sieti,
- Port je číslo služby, ktorú poskytuje serverová aplikácia (niektoré čísla služieb sú už obsadené).
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:
- Image1
- Server: TServerSocket
- Name=Server
- Active=False
- Port=51
- OnClientRead=ServerClientRead
- Client: TClientSocket
- Active =False
- Port=51
- OnRead=ClientRead

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:
- Pri spustení programu vypýtame IP adresu servera. Ďalej sa pokúsime aktivovať server a pripojiť sa k nemu.
- Vidíme, že pokým používateľ nezadal adresu servera, náš programe sa pripojí k serveru, ktorý beží na lokálnom počítači
- je to výhodné pre ladenie našich sieťových programov.
- Klienti posielajú serveru údaje o polohe myši.
- Server pri prijatí správy od klienta rozpošle polohu myši všetkým ostatným klientom.
- Klient pri prijatí správy od servera nakreslí krúžok na pozícii, ktorá bola poslaná v správe.
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:
- NetMsg.pas ... obsahuje definície údajových štruktúr, ktoré sa posielajú
cez sieť a funkcie, ktoré s nimi pracujú,
- Player.pas ... obsahuje definíciu objektovej triedy, ktorá popisuje stav
a vlastnosti jedného hráča, jednej motorky,
- Manager.pas ... obsahuje definíciu objektovej triedy, ktorá sa stará o správu celej
hry,
- FormUnit.pas ... zabezpečuje zobrazovanie a vstup od používateľa.
Po sieti sa posielajú tri druhy údajov - správ (viď. NetMsg.pas):
- nmkKey ... klient posiela serveru kód klávesu, ktorý
stlačil hráč,
- nmkPaint ... server posiela klientom správu o kreslení hráča,
- nmkGameOver ... server pošle túto správu klientovi, ktorí narazil do stopy a tým
pádom skončil hru.
Server bude využívať objekt Manager a objekty Player. Bude sa starať
o:
- evidenciu aktuálnych pripojených hráčov,
- od klientov bude dostávať správy o tom, ako majú ich motorky meniť smer,
- zabezpečí pohyb objektov,
- klientom oznámi aktuálny stav hry.
Klient bude:
- čítať vstup z klávesnice a posielať o tom správy serveru,
- prijímať informácie od servera o polohách všetkých motoriek a zabezpečovať ich vykresľovanie.
Celý program

© 2015 Ľ. SALANCI