Difference between revisions of "LU-LSP-b11:projekts"

From DiLab
Jump to: navigation, search
Line 2: Line 2:
Uzdevums: izstrādāt koncepciju un arhitektūru klienta-servera sistēmai, kas realizē daudzlietotāju vidi reālā laika stratēģiskai datorspēlei "Tanciņi".
Uzdevums: izstrādāt koncepciju un arhitektūru klienta-servera sistēmai, kas realizē daudzlietotāju vidi reālā laika stratēģiskai datorspēlei "Tanciņi".


= 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 (tanks vai šāviņš).

Spēle notiek līdz "last tank standing" - brīdim, kad palicis tikai viens tanciņš.


= Serveris =
= Serveris =
Line 7: Line 14:
Serverim jābūt savietojamam ar kopējo komunikācijas protokolu - tā, lai visu grupu klienti varētu pie tā slēgties!
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.
Serveris spēj saņemt šādas komandas:
* ?


Ieteicams lietot nebloķējošos soketus. Atbloķēšana notiek, atvērtam socket descriptoram 'fd' uzstādot O_NONBLOCK karodziņu:
Serveris var nosūtīt šādas komandas:
fcntl(fd, F_SETFL, O_NONBLOCK);
* ?


Ieteicams uzstādīt SO_REUSEADDR opciju.
Ir pasaules karte ar NxM šūnām. Katrā šūnā var būt:
* ?


Servera programmā ir "galvenais cikls" (<code>while (1)</code> vai <code>for (;;)</code>), tajā notiek:
Servera programmā ir "galvenais cikls" (<code>while (1)</code> vai <code>for (;;)</code>), 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.
Serveris uztur informāciju par klientiem:
* ?


= Klients =
= 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!
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.
Klients spēj saņemt šādas komandas:
* ?


Par sevi ieteicams ASCII formātā saglabāt informāciju: IP adrese un ports - iegūstama ar getsockname() + inet_ntoa() funkcijām.
Klients var nosūtīt šādas komandas:
* ?


Klienta programmā ir "galvenais cikls", tajā notiek:
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


= Direktorijas serveris =
= Direktorijas serveris =


Uztur informāciju par aktīvajiem serveriem:
Uztur informāciju par aktīvajiem serveriem.

* ?
==== 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 =
= Datu apmaiņas protokols =
Line 55: Line 78:


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.
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 ^ vai $ simbolus.


=== Komandas ===
=== Komandas ===
Line 79: Line 104:
Map info komandas parametri:
Map info komandas parametri:
* Kartes dimensijas: divi skaitļi N (platums) un M (augstums).
* Kartes dimensijas: divi skaitļi N (platums) un M (augstums).
* NxM burtus gara karte ar terrain type. piemēram: "R R R R X R ...". Karti sūta, sākot no augšējās rindas, no kreisās puses uz labo.
* NxM burtus gara karte ar terrain type. piemēram: "R R R R X R ...". Karti sūta, sākot no augšējās rindas, no kreisās puses uz labo.
* Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi:
* Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi:
"O-burts Tips X-koordināta Y-koordināta [citi paramteri]"
"O-burts Tips X-koordināta Y-koordināta [citi paramteri]"

Revision as of 18:16, 20 December 2011

Uzdevums: izstrādāt koncepciju un arhitektūru klienta-servera sistēmai, kas realizē daudzlietotāju vidi reālā laika stratēģiskai datorspēlei "Tanciņi".

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 (tanks vai šāviņš).

Spēle notiek līdz "last tank standing" - brīdim, kad palicis tikai viens tanciņš.

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

Direktorijas serveris

Uztur informāciju par aktīvajiem serveriem.

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 ^ vai $ simbolus.

Komandas

Klients -> serverim

  • S - start game Parametri: nav
  • E - disconnect (end game) Parametri: nav
  • G - go Parametri: virziens (U, B, L, vai R burti)
  • F - shoot (fire) Parametri: nav
  • T - stobra kustība (turret movement) (opcionāls) Parametri: virziens (U, B, L, vai R burti)

Serveris -> klientam

  • M - map info

Map info parametri

Kartes lauciņi var būt:

  • šķērslis (necaurejams tankiem, obstacle) - O
  • masīvs šķērslis (necauršaujaums & necaurejams tankiem) - X
  • ceļš (road) - R
  • zāle (grass, kustība notiek 2x lēnāk, nekā pa ceļu) (opcionāls) - G
  • purvs (swamp, kustība notiek 5x lēnāk, nekā pa ceļu) (opcionāls) - S

Map info komandas parametri:

  • Kartes dimensijas: divi skaitļi N (platums) un M (augstums).
  • NxM burtus gara karte ar terrain type. piemēram: "R R R R X R ...". Karti sūta, sākot no augšējās rindas, no kreisās puses uz labo.
  • Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi:

"O-burts Tips X-koordināta Y-koordināta [citi paramteri]"

Tips:

  • T - tanks
  • S - shot (šāviņš)

"Citus parametrus" norāda tikai tankam. Tie ir:

  • Tanka īpašnieka IP adrese un ports
  • Tanka virziens (U, B, L, R)
  • Tanka stobra virziens (U, B, L, R)
  • Health-status (0-100%)

Objekta piemērs: "O T 1 2 10.0.0.1 33780 L L 100" - tanks lauciņā (1,2), piederošs klientam ar adresi 10.0.0.1 un portu 33780, pavērsts pa kreisi, ar stobru pavērstu pa kreisi, ar 100% veselību.

Koordināta 0 0 atbilst augšējam kreisajam stūrim.