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.
Kujutame ette järgmist olukorda:
Sa kõnnid tänaval ja märkad ühte avatud restorani. See restoran sümboliseerib meie serverit, mis töötab pidevalt ja kuulab (listener) uute klientide saabumist. Kui restoran on suletud (server ei tööta), siis ei saa sa sinna ka kuidagi siseneda — uks on kinni ja sa saad lihtsalt veateate.
Aga kui restoran on avatud, siis sa saad rahulikult sisse astuda. Sissepääsu juures heliseb kelluke – see on märguanne töötajatele, et uus klient on ühendunud (connected).
Sellest hetkest alates alustab töötaja sinu jälgimist: ta paneb kirja kõik sinu tegevused:
kuhu sa istusid
mida sa menüüst vaatasid
millise roa tellisid
Kõik need tegevused salvestatakse serveri (restorani) poolel – see on nagu server sai kliendi tegevusinfo (received).
Täpselt samal ajal võivad restorani (serverisse) siseneda ka teised inimesed – igaühe kohta toimub sama protsess:
jälgitakse nende tegevust
salvestatakse nende tellimused
Oluline osa on ka see, et server jagab vajalikku infot teiste klientidega — näiteks mitmikmängus mängijate liikumine või tegevused.
Kui klient otsustab restoranist lahkuda, kõlab jälle väike signaal töötajatele – see tähendab, et ühendus on katkenud (disconnected). Töötaja eemaldab kohe kõik selle kliendiga seotud andmed: tema istumiskoht, tellimuste info ja muu tegevuslogi. Lisaks teavitatakse ka teisi kliente, et see inimene lahkus, ning nende ekraanid (lauaplaan) uuendatakse, eemaldades lahkunud kliendi andmed.
Mida me sellest näitest õppisime?
Tööpõhimõte, olulised mõisted ja sündmused:
Restoran = server, mis peab olema avatud (töötama), et saaks kliente vastu võtta
Klient astud ise sisse – klient alustab alati suhtlust
Listener on kogu aeg aktiivne – valmis uute ühenduste jaoks
Klient on see, kes peab juba varem teadma serveri aadressi, et serveriga ühenduda
Sisse astudes tekib connected sündmus
Iga tegevus, mida klient teeb, saadetakse serverile ja salvestatakse – see on received
Kui klient lahkub, tekib sündmus disconnected
Server jagab teistele klientidele olulist infot – see loob ühise mängumaailma
Server on kuningas ehk kliente ei saa usaldada. 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)
Kõik suhtlus klientide vahel toimub serveri kaudu
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!