vyuka:psi:cviceni:uloha1-karel-zadani

This is an old revision of the document!


Úloha č.1 - TCP Server a Client (zadání platné pro letní semestr 2013/2014)

Robot Karel se pohybuje po městě. Město tvoří 2-D plocha rozdělená na pole o souřadnicích (x,y). Ve městě nejsou žádné překážky. Robot umí provést krok vpřed, otočit se doleva a zvednout značku. Poskytuje také informaci o své pozici ve městě.

Robot se může pohybovat pouze ve městě, mimo město havaruje. Město má rozměr 37 x 37 polí, souřadnice x a y mohou nabývat hodnot z intervalu <-18,18>.

Na pozici (0,0) je značka. Úkol robota je dojít ke značce, zvednout ji a přečíst tajemství.

Server představuje robota, kterého ovládá klient. Využívá se komunikačního protokolu TCP, server naslouchá na portu, který je zvolen v intervalu 3000 až 3999 (včetně). Protokol je textově orientovaný a lze jej vyzkoušet např. pomocí příkazu telnet adresa_serveru 3999 (v případě portu 3999).

Po navázání spojení klientem vygeneruje server náhodně souřadnice robota a jeho orientaci. Souřadnice robota nechť jsou zvoleny v intervalu <-17,17> pro x i y. Klient si zjistí souřadnice robota. Protože klient nemá možnost přímo zjistit pozici robota a jeho orientaci, musí provést např. otočení a 1 krok a porovnat nové souřadnice robota (z odpovědí s kódem 240). Poté dovede robota pomocí příkazů ke značce. Značku zvedne. Při úspěšném zvednutí server prozradí text pod značkou a ukončí spojení. Pokud na daném místě značka není, server ohlásí chybu a také ukončí spojení (klient má pouze jeden pokus na zvednutí značky).

Bezprostředně po navázání spojení server odešle text se svojí identifikací zakončený znaky \r\n (konec řádky) (viz seznam odpovědí, kód 210). Dále již pouze čeká na příkazy klienta a posílá odpovědi na ně.

Příkazy

Příkazy posílá klient serveru.
Struktura: oslovení + mezera + jméno příkazu zakončené znaky \r\n
Příklad: Magdaleno KROK\r\n

Odpovědi

Odpověď se posílá na každý příkaz. Struktura: kód <mezera> řetězec odpovědi zakončený znaky \r\n
kde kód je číslo (textová reprezentace). Možné odpovědi:

odpověďvysvětlení
210 Text pozdravu robota Počáteční identifikace posílaná serverem. Posílá server ihned po navázání spojení.
240 OK (x,y) Poslední operace byla úspěšná. Hodnoty x a y jsou nové souřadnice robota (textová reprezentace).
260 USPECH Text tajemství Úspěšné zvednutí značky. Zároveň přečte tajemství značky (řetězec znaků).
500 NEZNAMY PRIKAZ Zadaný příkaz nebyl rozpoznán. Nebyla provedena žádná akce.
530 HAVARIE Robot vyšel mimo město a pravděpodobně havaroval.
550 NELZE ZVEDNOUT ZNACKU Na zadané pozici se nenachází značka.
571 PROCESOR FUNGUJE Pokus o opravu procesoru, který je v pořádku.
572 ROBOT SE ROZPADL Robot měl vadný procesor a přesto měl provést krok.
580 SELHANI PROCESORU x Robot má vadný procesor číslo x (číslo od 1 do 9, textová reprezentace).

Po odeslání odpovědí s kódem 260,530,550,571 a 572 se ihned ukončí spojení ze strany serveru. Po odeslání odpovědi s kódem 500 nebo 580 spojení zůstává navázané.

V textu pozdravu robota (odpověď 210) je třeba nalézt oslovení, abychom mohli posílat robotovi příkazy. Oslovení se může ukrývat kdekoliv v textu pozdravu a lze ho nalézt jako podřetězec s formátem: “Oslovuj mne JMÉNO.” Jméno je řetězec libovolných znaků kromě \r, \n, \0 a tečky. Mezera nesmí být na začátku nebo na konci jména, uprostřed však ano. Jméno může být dlouhé až 512 bytů, minimálně však 1 byte. Na velikosti písmen ve jméně záleží. Není podporováno žádné kódování češtiny. Pokud použijete kódování češtiny, bude vše pravděpodobně chodit. V případě UTF může být problém, pokud druhý byte znaku obsahuje \r,\n,mezeru nebo tečku.

V případě serveru není povoleno rekurzivní vnořování konstrukce “Oslovuj mne Oslovuj mne Oslovuj mne Robote…”. Není též povoleno ani takové rekurzivní vnoření, kdy jedna z variant není platná, neboť přesahuje maximální povolenou délku. Příklady:

  • Oslovuj _ mne _ Honzo. ⇒ Honzo
  • Oslovuj _ mne _ Oslovuj _ mne _ Honzo.. ⇒ nepovolená konstrukce (rekurze), klient může chápat oslovení různě
  • Oslovuj _ mne _ .Oslovuj _ mne _ Honzo. ⇒ Honzo (povolená konstrukce, není rekurze, první jméno není platné, protože je prázdné, je to tedy součást textu pozdravu)
  • Oslovuj _ mne _ _ Oslovuj _ mne _ Honzo. ⇒ Honzo (povolená konstrukce, není rekurze, první jméno není platné, protože začíná mezerou, je to tedy součást textu pozdravu)
  • Oslovuj _ mne _ Jene _ .Oslovuj _ mne _ Honzo. ⇒ Honzo (povolená konstrukce, není rekurze, první jméno není platné, protože končí mezerou, je to tedy součást textu pozdravu)
  • Oslovuj _ mne _ Jene. Oslovuj _ mne _ Honzo. ⇒ nepovolená konstrukce, víc než jedno oslovení splňující syntaxi

Robot může mít poruchu a nesplnit příkaz KROK (odpověď 580). V tomto případě je třeba robota opravit příkazem OPRAVIT a poté zavolat původní příkaz znovu. Opravit lze pouze procesor v poruše, jinak robot ukončí spojení se zprávou 571. Pokud má robot vadný procesor a je volán příkaz KROK, bude spojení ukončeno se zprávou 572. Na začátku má robot všechny procesory v pořádku. Robot nevydrží větší množství kroků a po desátém příkazu KROK (těsně po sobě) mu už určitě některý procesor selže. Může se však selhat i dříve.

Seznam příkazů

Příkaz KROK

Syntaxe: oslovení KROK\r\n
Význam: Provede krok robota směrem, kterým je robot orientován. Po provedení tohoto příkazu se souřadnice x nebo y zvýší nebo sníží o jedničku.
Oslovení je třeba zjistit z odpovědi 210.
Robot nesmí být porouchaný, jinak se rozpadne (zpráva 572). Pokud není porouchaný, může se porouchat (zpráva 580).
Kódy možných odpovědí: 240,530,580,572

Příkaz VLEVO

Syntaxe: oslovení VLEVO\r\n
Význam: Změní orientaci robota. Robot se otočí o 90 stupňů doleva.
Oslovení je třeba zjistit z odpovědi 210.
Kódy možných odpovědí: 240

Příkaz ZVEDNI

Syntaxe: oslovení ZVEDNI\r\n
Význam: Zvedne značku. Pokud není robot na souřadnici (0,0), dojde k chybovému hlášení serveru. Po zavolání tohoto příkazu server vždy ukončí spojení.
Oslovení je třeba zjistit z odpovědi 210.
Kódy možných odpovědí: 260,550

Příkaz OPRAVIT

Syntaxe: oslovení OPRAVIT n\r\n kde n je číslo od 1 do 9 a označuje číslo procesoru, který selhal.
Význam: Opraví zadaný procesor robota. Opravit lze pouze ten procesor, který byl odpovědí 580 označen jako vadný. Pokud má robot vadný procesor a nebude opraven, nelze provést další příkaz KROK. Ostatní příkazy jsou vykonány.
Oslovení je třeba zjistit z odpovědi 210.
Kódy možných odpovědí: 240,571

Jiné příkazy robot nezná. Na chybně zadané příkazy server reaguje odpovědí s kódem 500.

kurzíva = text zobrazený v terminálu při spuštění a po ukončení spojení
tučně = server (robot)
normálně = klient

xsmitka@fray1:/home/zam/xsmitka>telnet baryk.felk.cvut.cz 3999
Trying 147.32.232.173…
Connected to baryk.felk.cvut.cz.
Escape character is '^]'.

210 Ahoj, tady je robot verze 1.6. Oslovuj mne Magdaleno.
Magdaleno VLEVO
240 OK (13,7)
Magdaleno KROK
240 OK (12,7)
Magdaleno KROK
580 SELHANI PROCESORU 8
Magdaleno OPRAVIT 8
240 OK (12,7)
Magdaleno KROK
580 SELHANI PROCESORU 3
Magdaleno OPRAVIT 3
240 OK (12,7)
Magdaleno KROK
240 OK (11,7)
Magdaleno KROK
580 SELHANI PROCESORU 3
Magdaleno OPRAVIT 3
240 OK (11,7)
Magdaleno KROK
240 OK (10,7)
Magdaleno KROK
580 SELHANI PROCESORU 9
Magdaleno OPRAVIT 9
240 OK (10,7)
Magdaleno KROK
240 OK (9,7)
Magdaleno KROK
240 OK (8,7)
Magdaleno KROK
240 OK (7,7)
Magdaleno KROK
240 OK (6,7)
Magdaleno KROK
240 OK (5,7)
Magdaleno KROK
240 OK (4,7)
Magdaleno KROK
240 OK (3,7)
Magdaleno KROK
240 OK (2,7)
Magdaleno KROK
240 OK (1,7)
Magdaleno KROK
240 OK (0,7)
Magdaleno VLEVO
240 OK (0,7)
Magdaleno KROK
240 OK (0,6)
Magdaleno KROK
240 OK (0,5)
Magdaleno KROK
240 OK (0,4)
Magdaleno KROK
240 OK (0,3)
Magdaleno KROK
580 SELHANI PROCESORU 7
Magdaleno OPRAVIT 7
240 OK (0,3)
Magdaleno KROK
240 OK (0,2)
Magdaleno KROK
240 OK (0,1)
Magdaleno KROK
240 OK (0,0)
Magdaleno ZVEDNI
260 USPECH Kobyla ma maly bok.
Connection to baryk.felk.cvut.cz closed by foreign host.
xsmitka@fray1:/home/zam/xsmitka>

  • programuje se jak klientská, tak serverová část,
  • klient umí vyzvednout tajemství zcela automaticky bez zásahu člověka (během celého spojení),
  • klientská i serverová část musí 100% fungovat s protistranou na serveru baryk.felk.cvut.cz (viz níže),
  • klient má možnost navázat se stejným serverem více spojení paralelně i postupně za sebou (bez restartu serveru),
  • server i klient musí být stabilní a odolní proti neočekávaným vstupům,
  • programy by měly vypisovat alespoň základní informace o svém stavu (např. posílané a přijímané příkazy či odpovědi),
  • IP adresa nebo DNS jméno serveru a port se zadávají jako parametr v příkazové řádce při spuštění klienta (tzn. není zadrátovaná ve zdrojového kódu), syntaxe viz níže,
  • klient viditelně vypíše v případě úspěšného zvednutí značky její tajemství,
  • server musí vypisovat informace o aktuálně obslouženém klientovi (aby bylo možno říct, komu byla odpověď odeslána),
  • zdrojový text musí být komentovaný, v hlavičce všech zdrojových textů musí být uveden autor,
  • povolené programovací jazyky jsou následující: Java, C, C++.
  • při implementaci pište klientskou i serverovou část do jednoho zdrojového souboru. Tento soubor můžete pojmenovat jakkoliv, avšak s příponou .c, .cpp nebo .java. Tyto soubory musí být přeložitelné řádkovým překladačem (gcc/g++/javac). Odevzdává se pouze tento jeden zdrojový kód, neimplementujte tedy nic do dalších souborů mimo něj.
  • pokud použijete jazyk Java, napište na začátek zdrojového textu package robot a třídu s metodou main pojmenujte Robot. Můžete použít připravenou šablonu, která je k dispozici ke stažení mezi příklady programů.
  • po spuštění se program musí rozhodnout, zda je server nebo klient, a to podle parametrů v příkazové řádce:

role klienta: ./robot <server> <port>
role serveru: ./robot <port>
kde <server> je jméno nebo IP adresa serveru a <port> je číslo portu, na kterém server naslouchá.

  • každý student má povinnost průběžně uploadovat aktuální stav svého zdrojového kódu přes WWW rozhraní serveru baryk.felk.cvut.cz. Předpokládá se, že vždy po ukončení práce na programu nahrajete svůj kód na server Baryk. Také se předpokládá, že pokud k danému dni není záznam o uploadu Vašeho programu, tak jste na programu tento den nepracoval(a). Jinak řečeno, uploadováním svého programu vykazujete činnost (stejně jako v komerčním prostředí) a zároveň se chráníte před obviněním z nepoctivého jednání (přečtěte si obecné požadavky na úlohy na hlavní stránce předmětu).
  • nepoužívejte pro komunikaci metodu PrintStream.println(příkaz). Zjednodušeně udělá ekvivalent následujícího: print(příkaz + System.getProperty(“line.separator”), kde line.separator je na různých platformách různý.
  • Používejte metody, které znáte a víte přesně, co dělají. BufferedReader.readLine() se pro server opravdu nehodí, viz Javadoc - BufferedReader.readLine().
  • Dejte si pozor na časovou složitost IO operací, i když se to nezdá, mohou výrazně zpomalit běh programu, viz. malý test rychlosti.

Referenční server pro první úlohu běží na adrese baryk.felk.cvut.cz na portu 3999. Proti tomuto serveru lze zkoušet Vaše řešení klienta. Funkčnost serveru lze ověřit zadáním příkazu:
telnet baryk.felk.cvut.cz 3999

Testování Vašeho serveru testovacím klientem není možné provádět přímo z učebny (neprojde NATem). Proto bylo na serveru Baryk vyrobeno rozhraní, přes které můžete uploadovat svůj zdrojový kód a Baryk jej:

  1. zaarchivuje
  2. přeloží
  3. spustí v roli serveru
  4. na požádání otestuje

Překlad bude proveden podle použitého jazyka takto:

C gcc -o robot source.c -lpthread
C++ g++ -o robot source.c -lpthread
Java javac source.java

Pokud není Váš počítač schován za NATem, lze v rámci sítě ČVUT využít i testování přes síť. Na webové stránce http://baryk.felk.cvut.cz/cgi-bin/robottcp zadáte IP adresu a port, na kterém běží Vaše implementace serveru. Po odeslání této informace bude Váš server otestován naším klientem. Výsledek bude zobrazen.

K dispozici máte seznam nejčastějších chyb, které mohou při testování nastat, a jejich popis.

Úlohu je třeba odevzdat do 8. týdne (podle termínu Vašeho cvičení, tj. cvičení, kam jste zapsáni podle rozvrhu).

Za každý týden prodlení je penalizace -0,5 bodu (jako přelom týdne se počítá konec cvičení). Úlohu není možné odevzdat po zápočtovém týdnu.

Odevzdat lze pouze takovou úlohu, která:

  • je přeložitelná na serveru baryk.felk.cvut.cz
  • komunikuje se serverem baryk.felk.cvut.cz (v případě klienta; stačí otevřít spojení a přijmout úvodní zprávu 210)
  • je schopná testování přes rozhraní serveru baryk.felk.cvut.cz (v případě serveru; testovací klient musí správně přijmout úvodní zprávu 210)

Postup odevzdání:

  1. otestujte svoje řešení proti serveru Baryk (klienta i server) i svého klienta a servera proti sobě
  2. připravte si zdrojové texty k nahlédnutí
  3. připravte si internetový prohlížeč na server Baryk a připravte se na překlad zdrojového kódu
  4. spusťte terminál, nastavte adresář s Vaší úlohou jako aktuální a zadejte příkaz ls -l
  5. zavolejte cvičícího

Za odevzdání automaticky získáváte 8 bodů, ze kterých Vám může být stržena penalizace:

  • server nezpracovává požadavky klienta paralelně: -2
  • chybně implementovaný protokol na straně klienta: -3
  • chybně implementovaný protokol na straně serveru: -3
  • nestabilita: -3
  • malá odolnost vůči nestandardním vstupům: -3
  • klient nevyzvedává tajemství plně automaticky: -3
  • chyby v programu, které se neprojevily přímo: dle povahy -1 až -5
  • nečistý zdrojový kód: -1
  • zdrojový kód nebyl průběžně uploadován na server Baryk: -5
  • vyuka/psi/cviceni/uloha1-karel-zadani.1394196222.txt.gz
  • Last modified: 2014/03/07 12:43
  • by votavon1