Vaatame värskenduseks üle mõned lihtsad klient-server arhitektuuri põhimõtted, mida tasuks meeles pidada, kui mängu multiplayer loogikat üles seadma hakata. Pärast seda läheme käed külge ja paneme oma demo serveri ja kliendi samm-sammult püsti!
1. Klient & server: sissejuhatus¶
Mis on klient? Ja kes on server?
Need ei ole midagi muud kui rollid.
Mõtle, et kõnnid tänaval ja astud sisse ühte restorani. Istud lauda, sirvid natuke menüüd ja vajutad nuppu “Kutsu teenindaja”. Oleks ju imelik, kui teenindaja juba tuleks suvalise salatiga – enne, kui sa midagi üldse tellinud oled? Samuti oleks ju veider, kui telliksid koerasuppi ja teenindaja (serveerija, server) tulekski sellega kohale?!*
* vähemalt Eesti kultuuriruumis
Sellest natuke tobedast näitest võiks kaasa võtta kaks põhimõtet:
Klient alustab alati esimesena suhtlust (võib mõelda nii restorani sisenemise, “Kutsu teenindaja” nupu vajutamise kui toidu tellimise peale). Siit järeldub:
server peab juba enne kuulama (ing k. listen), et olla valmis vastu võtma uusi tellimusi/ühendusi. Järelikult peab sinu server töötama pidevalt
klient on see, kes peab juba varem teadma serveri aadressi, et serveriga ühenduda (et “meelepärasesse restorani kõndida” või “õiget toitu tellida”); server üldiselt klientide aadresse ette teadma ei pea
Server on kuningas ehk kliente ei saa usaldada. Võibolla äri-IT’s öeldakse, et klient on kuningas, aga kui klient tellib sinu naabri-pitsu, kas talle siis ikka peaks seda võimaldama? Siin kursusel on eelkõige tähtis mäng tööle saada, kuid tasub meeles pidada, et:
klient saab oma päringut tahtmise korral manipuleerida (nt, et ühe ruudu asemel liikus 10 ruutu) ja serverile suvalist sisendit sööta, millest võivad tekkida turvaprobleemid või sohitegemine
kui mõni mängija ära kukub/tal on halb internetiühendus, ei peaks see liialt mõjutama teisi mängijaid. Järelikult kõik tähtis mängu seis (game state) peaks püsima serveri poolel (nt AI-mängija uute koordinaatide arvutamine, skoori üle arve pidamine, ...)
Lihtsuse mõttes võib mõelda, et meil on ainult üks server ja vastavalt ajahetkele null kuni mitu klienti.
1.1. Näited¶
Näiteid programmidest, mis käituvad serveri rollis vs. kliendi rollis:
Protokoll |
Server |
Klient |
---|---|---|
HTTP (Hypertext Transfer Protocol) |
nginx, Apache |
Google Chrome, curl |
SSH (Secure Shell) |
sshd* (OpenSSH server) |
ssh (OpenSSH client), PuTTY |
Sinu mäng! (nt Kryonet abiga TCP & UDP peal) |
server.jar |
client.jar |
* Fun fact: "d" programminimede lõpus tähistab tihti daemon e. taustal jooksev programm
Nagu näha, peavad klient ja server rääkima sama keelt – sama protokolli, sama koodi –, et üksteisest aru saada.
Tihti räägitakse ka serveritest kui masinatest (nt serveriruumis), kuid need on “lihtsalt” arvutid, mis täidavad serveri rolli.
1.2. Kokkuvõtteks¶
Klient ja server on rollid
Klient alustab suhtlust esimesena ja seega peab teadma serveri aadressi (ja porti), millega ta ühenduda soovib
Server peaks olema pidevalt kuuldel, et uusi ühendusi vastu võtta (programm pidevalt jooksma)
Server on kuningas (hoia tähtis mänguseis serveris; eriti päris elus valideeri alati kliendi sisendit)
Järgmiseks panemegi samm-sammult püsti oma demo serveri ja kliendi!