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.


Alternatiivne tekst

Mida me sellest näitest õppisime?

  1. 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

  2. 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:

    1. 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

    2. 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, ...)

image1

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!