LU-LSP-b12:projekts
Uzdevums: izstrādāt klienta-servera sistēmu reālā laika daudzlietotāju stratēģiskai datorspēlei
Spēle
Ir pasaules karte ar NxM šūnām. Katrā šūnā ir kāds konkrēts zemes tips (terrain type).
Katrā šūnā var būt viens objekts (piemēram, spēlētājs vai šāviņš).
Spēle notiek līdz brīdim, kad palicis tikai viens spēletājs.
Serveris
Serverim jābūt savietojamam ar kopējo komunikācijas protokolu - tā, lai visu grupu klienti varētu pie tā slēgties!
Serveris uztur informāciju par klientiem - katram klientam viens atvērts TCP sokets. Ieteicams (bet ne obligāti) katram klientam uzturēt savu pavedienu. Par klientu ieteicams ASCII formātā saglabāt informāciju: IP adrese un ports - iegūstama ar getpeername() + inet_ntoa() funkcijām.
Ieteicams lietot nebloķējošos soketus. Atbloķēšana notiek, atvērtam socket descriptoram 'fd' uzstādot O_NONBLOCK karodziņu:
fcntl(fd, F_SETFL, O_NONBLOCK);
Ieteicams uzstādīt SO_REUSEADDR opciju.
Servera programmā ir "galvenais cikls" (while (1)
vai for (;;)
), tajā notiek:
- No klientiem saņemto datu apstrāde (pati saņemšana var tikt realizēta klientu pavedienos)
- Spēles pasaule pārrēķināšana
Šeit, vai arī atsevišķā pavedienā tiek realizēta arī jaunu klientu konekciju akceptēšana.
Klients
Klients parāda spēles pasauli un statusu uz ekrāna, ielasa ievadi no klaviatūras un komunicē ar serveri.
Klientam jābūt savietojamam ar kopējo komunikācijas protokolu - tā, lai tas spētu slēgties pie visu grupu serveriem!
Ieteicams lietot nebloķējošos soketus.
Par sevi ieteicams ASCII formātā saglabāt informāciju: IP adrese un ports - iegūstama ar getsockname() + inet_ntoa() funkcijām.
Klienta programmā ir "galvenais cikls", tajā notiek:
- Ievades ielasīšana no klaviatūras
- Komandu nosūtīšana uz serveri
- Kartes informācijas saņemšana no servera
- Spēles pasaules pārzīmēšana
Šāviņu trajektorijas rēķināšanu ieteicams realizēt arī klienta pusē. Ja no servera pēc tam tomēr tiek saņemta konfliktējoša kartes informācija, jāizmanto tā.
Direktorijas serveris
Uztur informāciju par aktīvajiem serveriem.
Atbalsta šādas komandas:
Komanda SERVER LIST
- Virziens: C->D
- Apraksts: Klients prasa direktoriju serverim pieejamo serveru sarakstu.
- Pieprasījums: ^L $
- Pieprasījuma piemērs: ^L $
- Atbilde: ^<IP>\t<PORTS>\r<IP>\t<PORTS>$
- Atbildes piemērs: ^192.168.1.101 1337 192.168.1.102 1338$
Komanda ADD SERVER
- Virziens: S->D
- Apraksts: Serveris piesaka sevi direktoriju serverim, lai citi spēlētāji varētu atrast šo serveri. Direktoriju serveris pats noskaidros servera ip. Serveris tiek automātiski izņemts no saraksta 30 sekunžu laikā, tāpēc šī komanda serverim jāizsauc, piemēram, reizi 25 sekundēs.
- Pieprasījums: ^A <PORTS>$
- Pieprasījuma piemērs: ^A 1337$
- Atbilde: ^<SUCCESS>$
- Atbildes piemērs: ^:)$ ^:($
Datu apmaiņas protokols
Izmanto TCP protokola soketus, ports 1337.
ASCII formāts datiem.
Komandas sākumu apzīmē ar '^'.
Komandas beigas apzīmē ar '$'.
Komandas piemērs:
^G U$
Nozīme: "go up" - virzīties uz augšu.
Komandu parameterus vienu no otra atdala ar kādu no whitespace simboliem: tukšumu, tab ('\t'), newline ('\n') vai carriage return ('\r') simboliem. Ja ir vairāki whitespace simboli pēc kārtas, tie jāuztver analoģiski vienam.
Pa soketiem bez komandām var tikt pārsūtīta arī cita veida informācija. Piemēram, atkļūdošanas printf() funkciju rezultāti. Tādu informāciju var ignorēt, kamēr vien tā nesatur ^ simbolu.