vyuka:psi:cviceni:uloha1-karel-zadani

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
vyuka:psi:cviceni:uloha1-karel-zadani [2012/02/21 20:06] – [Situace] kubrvyuka:psi:cviceni:uloha1-karel-zadani [2019/12/05 13:14] (current) – [Bodování] kubr
Line 1: Line 1:
-====== Úloha č.1 - TCP Server a Client (zadání platné pro letní semestr 2011) ======+====== Úloha č.1 - TCP Server ======
  
 ===== Situace ===== ===== Situace =====
  
-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ážkyRobot umí provést krok vpřed, otočit se doleva a zvednout značku. Poskytuje také informaci o své pozici ve městě.+Na planetě Mars bylo vypuštěno několik průzkumných robotůRoboti posílají informace ze senzorů a fotografie okolí na stacionární družici na oběžné drázeNastřádané informace jsou později družicí odeslány k Zemi.
  
-Robot se může pohybovat pouze ve městěmimo město havarujeMěsto má rozměr 43 x 43 polísouřadnice //x// //y// mohou nabývat hodnot z intervalu <//-//21,21>.+Bohužel však nejsou roboti na povrchu planety sami. Na komunikační server na družici se neustále kdosi pokouší připojovatprolámat ochrany a server kompromitovatNevímezda se jedná o konkurenci nebo o cizí formu života, v každém případě je třeba server chránit striktně dodržovat komunikační protokol.
  
-Na pozici (0,0) je značka. Úkol robota je dojít ke značce, zvednout ji a ečíst tajemství.+Implementujte server běžící na družicikterý bude od robotů ijímat a ukládat informace.
  
 ===== Obecné schema komunikace ===== ===== Obecné schema komunikace =====
  
-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// 3555'' (v případě portu 3555).+Komunikační protokol je postaven nad transportním protokolem 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 jeho orientaci. Souřadnice robota nechť jsou zvoleny v intervalu <//-//20,20> pro //x// i //y//Klient si zjistí souřadnice robota. Protože klient nemá možnost ímo zjistit pozici robota 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 také ukončí spojení (klient má pouze jeden pokus na zvednutí značky).+Server očekává, že se k němu budou připojovat jednotliví klienti (roboti). Server si po navázání spojení klientem vyžádá autorizaci autentizaci robota pomocí heslaPoté může server ijmout informace ze senzorů načíst fotografie okolí (pokud ji robot pošle). Po odpojení klienta nebo při porušení pravidel protokolu (detekováno na straně serveru) je spojení ukončenoNa server se může připojovat více robotů najednou je třeba je obsloužit tak, aby komunikace s jedním robotem neblokovala komunikaci s jiným robotem.
  
-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 200). Dále již pouze čeká na příkazy klienta a posílá odpovědi na ně.+<code> 
 +       Klient                                             Server
  
-===== Struktura dat =====+                    ---------- connect -----------> 
 +                                                    server si vyžádá zadání 
 +                                                    uživatelského jména 
 +                    <--------- zpráva 200 --------- 
 +robot pošle svoje 
 +uživatelské jméno 
 +                    ---------- zpráva U ----------> 
 +                                                    server si zapamatuje 
 +                                                    zaslané uživatel. jméno 
 +                                                    (v této fázi neprovádí 
 +                                                    žádnou kontrolu 
 +                                                    povolených znaků a délky 
 +                                                    uživatelského jména) 
 +                    <--------- zpráva 201 --------- 
 +robot pošle svoje 
 +heslo 
 +                    ---------- zpráva P ----------> 
 +                                                    server si zkontroluje 
 +                                                    poslané uživatelské 
 +                                                    jméno a heslo. 
 +                                                     
 +                                                    Pokud kontrola selhala, 
 +                                                    bude odeslána zpráva 
 +                                                    500 a spojení bude ze 
 +                                                    strany serveru ukončeno. 
 +                    <--------- zpráva 500 --------- 
 +                                                    close() 
 +                                                     
 +                                 NEBO
  
-=== Příkazy ===+                                                    Pokud prošla kontrola 
 +                                                    bez chyby, bude odeslána 
 +                                                    zpráva 202. 
 +                    <--------- zpráva 202 --------- 
 +Robot může nyní 
 +poslat informace 
 +ze senzorů a odeslat 
 +fotografie okolí. 
 +Lze podeslat libovolný 
 +počet zpráv I a F. 
 +                    ---------- zpráva I ----------> 
 +                                                    Pokud nesedí syntaxe  
 +                                                    zprávy I, bude odeslána 
 +                                                    zpráva 501 a spojení  
 +                                                    bude ukončeno.
  
-Příkazy posílá klient serveru.\\ +                                                    Zpráva je uložena do 
-Struktura: oslovení + mezera + jméno příkazu zakončené znaky \r\n\\ +                                                    logu, zpátky bude 
-Příklad: **//Magdaleno KROK\r\n//**\\+                                                    odeslána zpráva 202
 +                    <--------- zpráva 202 --------- 
 +další zpráva 
 +                    ---------- zpráva I ---------->  
 +                                                    Pokud nesedí syntaxe  
 +                                                    zprávy I, bude odeslána 
 +                                                    zpráva 501 a spojení  
 +                                                    bude ukončeno.
  
 +                                                    Zpráva je uložena do
 +                                                    logu, zpátky bude
 +                                                    odeslána zpráva 202.
 +                    <--------- zpráva 202 ---------
 +a také fotografie
 +                    ---------- zpráva F ----------> 
 +                                                    Pokud nesedí syntaxe 
 +                                                    zprávy F, bude odeslána
 +                                                    zpráva 501 a spojení 
 +                                                    bude ukončeno.
  
-=== Odpovědi === +                                                    Zpráva F obsahuje 
-Odpověď se posílá na každý příkaz. +                                                    kontrolní součet, 
-Struktura: ''//kód// <mezera> řetězec odpovědi zakončený znaky \r\n''\\ +                                                    ten je třeba 
-kde //kód// je číslo (textová reprezentace). Možné odpovědi:\\ +                                                    zkontrolovatPokud 
-^odpověď^vysvětlení^ +                                                    součet nesedí, bude 
-|200 //Text pozdravu robota//   |Počáteční identifikace posílaná serveremPosílá server ihned po navázání spojení.  | +                                                    odeslána zpráva 300, 
-|210 USPECH //Text tajemství//  |Úspěšné zvednutí značky. Zároveň přečte tajemství značky (řetězec znaků).  | +                                                    spojení nebude 
-|240 OK (//x//,//y//          |Poslední operace byla úspěšHodnoty //x// //y// jsou nové souřadnice robota (textová reprezentace).  | +                                                    ukončeno, zpráva však 
-|500 NEZNAMY PRIKAZ             |Zadaný příkaz nebyl rozpoznán. Nebyla provedena žádná akce | +                                                    nebude uložena na disk. 
-|530 HAVARIE                    |Robot vyšel mimo město a pravděpodobně havaroval. +                                                     
-|550 NELZE ZVEDNOUT ZNACKU      |Na zadané pozici se nenachází značka.  | +                                                    Jinak bude fotografie 
-|571 PROCESOR FUNGUJE           |Pokus o opravu procesoru, který je pořádku.  | +                                                    uložena na disk 
-|572 ROBOT SE ROZPADL           |Robot měl vadný procesor přesto měl provést krok.  | +                                                    server odešle zprávu 
-|580 SELHANI PROCESORU //x//         |Robot má vadný procesor číslo //x// (číslo od 1 do 9textová reprezentace).  | +                                                    202
-Po odeslání odpovědí s kódem 210,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é.+                    <--------- zpráva 202 --------- 
 +Robot pokračuje 
 +odesílání zpráv 
 +Fnakonec 
 +spojení uzavře.
  
-V textu pozdravu robota (odpověď 200je 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.+close() 
 +                                                    Server reaguje  
 +                                                    uzavřením spojení
  
-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: +                                                    close() 
-  * ''Oslovuj _ mne _ Honzo.''// => Honzo// +</code>
-  * ''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ů ===+Spojení musí být ukončeno do 45 sekund, jinak bude ze strany serveru násilně ukončeno (zpráva 502).
  
-== Příkaz KROK == +===== Struktura posílaných zpráv =====
-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 200.\\ +
-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 == +==== Zprávy poslané klientem ====
-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 200.\\ +
-Kódy možných odpovědí: 240+
  
-== Příkaz ZVEDNI == +^zpráva^význam^syntaxe^ 
-Syntaxe: ''oslovení ZVEDNI\r\n''\\ +|  **U**  |uživatelské jméno robota  |řetězec znaků zakončený ''\r\n'' (tj. hexadecimálně 13h a 10h). Není kladeno žádné omezení na délku nebo obsah tohoto řetězce (nesmí pouze obsahovat ''\r\n'', protože touto sekvencí je zpráva zakončena)
-Význam: Zvedne značkuPokud není robot na souřadnici (0,0), dojde k chybovému hlášení serveruPo zavolání tohoto příkazu server vždy ukončí spojení.\\ +|  **P**  |heslo robota              |řetězec znaků zakončený ''\r\n'' (tj. hexadecimálně 13h a 10h). Není kladeno žádné omezení na délku nebo obsah tohoto řetězce (nesmí pouze obsahovat ''\r\n'', protože touto sekvencí je zpráva zakončena)Povolená uživatelská jména a hesla jsou uvedena níže. | 
-Oslovení je třeba zjistit z odpovědi 200.\\ +|  **I**  |informace ze senzorů      |''INFO ''<mezera> <libovolný řetězec znaků> ''\r\n'' | 
-Kódy možných odpovědí: 210,550+|  **F**  |fotografie okolí          |''FOTO ''<mezera> <délka fotografie> <mezera> <data> <kontrolní součet>|
  
-== Příkaz OPRAVIT =+===Poznámky ke zprávě I===
-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 200.\\ +
-Kódy možných odpovědí: 240,571+
  
-Jiné íkazy robot nezná. Na chybně zadané příkazy server reaguje odpovědí kódem 500.+Za klíčovým slovem INFO následuje mezera a poté libovolný řetězec znaků neobsahující ''\r\n''. Tento řetězec nemá omezenou velikost. Zpráva je ukončena sekvencí ''\r\n''
 + 
 +//Příklad zprávy I:// 
 +<code> 
 +INFO Teplotní senzor č.3 se porouchal.\r\n 
 +</code> 
 + 
 +===Poznámky ke zprávě F=== 
 + 
 +Délka fotografie se udává dekadickým zápisem v počtu bytů posílaného obrázku (bez kontrolního součtu). Tolik bytů dat je třeba ijmout a uložit do souboruDélka musí být kladná nenulová. Délka není shora omezena. 
 + 
 +Data jsou binární povahy a obsahují fotografii okolí. Tuto fotografii je třeba uložit do souboru (v aktuálním adresáři) s názvem "fotoXXX.png", kde XXX je libovolné celé číslo od 0 do 999. Po skončení přenosu fotografie nebo po ukončení spojení se musí soubor s fotografií buď vymazat (chybný kontrolní součet, nekompletní přenos) nebo přejmenovat (je-li to nutné) na požadované jméno souboru. 
 + 
 +**Na Barykovi fotografii neukládejte.** 
 + 
 +Kontrolní součet následuje bezprostředně za koncem posílané fotografie. Jedná se o 4 byty ve formátu Big Endian (nejdříve se posílá nejvýznamnější byte slova). Kontrolní součet spočítáte jako součet všech jednotlivých bytů fotografie. 
 + 
 +//Příklad zprávy F:// 
 +<code> 
 +FOTO 2775 @xfv8aw**<%#cd^aa ...(celkem 2775 bytů binárních dat) (4 byty kontrolního součtu) 
 +</code> 
 + 
 +//Příklad krátké zprávy F pro demonstraci výpočtu kontrolního součtu:// 
 +<code> 
 +FOTO 8 ABCDEFGH\x00\x00\x02\x24 
 +</code> 
 +Kontrolní součet je 65+66+67+68+69+70+71+72=548 (hex 224), tj. v binárním zápise v kódování Big Endian: <00h> <00h> <02h> <24h>. V tomto příkladu je zápisem \xHH označen 1 byte hexadecimální hodnotou HH. 
 + 
 +==== Zprávy poslané serverem ==== 
 + 
 +^zpráva^význam^syntaxe^ 
 +|  **200**  |požadavek na zadání uživatelského jména  |''200 //<mezera>// LOGIN \r\n'' 
 +|  **201**  |požadavek na zadání hesla  |''201 //<mezera>// PASSWORD \r\n'' 
 +|  **202**  |server je připraven přijmout zprávu  |''202 //<mezera>// OK \r\n'' 
 +|  **300**  |chybný kontrolní součet  |''300 //<mezera>// BAD CHECKSUM \r\n'' 
 +|  **500**  |neplatné uživatelské jméno nebo heslo  |''500 //<mezera>// LOGIN FAILED \r\n'' 
 +|  **501**  |chyba syntaxe zprávy I nebo F  |''501 //<mezera>// SYNTAX ERROR \r\n'' 
 +|  **502**  |timeout (45 sekund od zahájení spojení)  |''502 //<mezera>// TIMEOUT \r\n'' 
 + 
 +Po odeslání zprávy 500,501 a 502 je vždy ze strany serveru uzavřeno spojení. 
 + 
 +Po odeslání zprávy 300 se spojení neukončí, avšak fotografie není uložena do souboru. 
 + 
 +Zpráva 501 se posílá ihned po detekování chybné syntaxe (např. místo I (INFO) nebo F (FOTO) přijde znak X). 
 +//Pozor na telnet, zapsaná řádka je odeslána až po stisku klávesy ENTER.//
  
 ===== Příklad komunikace ===== ===== Příklad komunikace =====
  
 //kurzíva// = text zobrazený v terminálu při spuštění a po ukončení spojení\\ //kurzíva// = text zobrazený v terminálu při spuštění a po ukončení spojení\\
-**tučně** = server (robot)\\ +**tučně** = server (družice)\\ 
-normálně = klient\\+normálně = klient (robot)\\ 
 +Sekvence ''\r\n'' jsou zobrazeny jako konce řádků.
  
-//xsmitka@fray1:/home/zam/xsmitka>telnet baryk.felk.cvut.cz 3999\\+//xsmitka@fray1:/home/zam/xsmitka>telnet baryk-ng.fit.cvut.cz 3999\\
 Trying 147.32.232.173...\\ Trying 147.32.232.173...\\
-Connected to baryk.felk.cvut.cz.\\+Connected to baryk.fit.cvut.cz.\\
 Escape character is '^]'.//\\ Escape character is '^]'.//\\
-**200 Ahoj, tady je robot verze 1.6. Oslovuj mne Magdaleno.**\\ +**200 LOGIN**\\ 
-Magdaleno VLEVO\\ +Robot Emil cislo 33\\ 
-**240 OK (13,7)**\\ +**201 PASSWORD**\\ 
-Magdaleno KROK\\ +1645\\ 
-**240 OK (12,7)**\\ +**202 OK**\\ 
-Magdaleno KROK\\ +INFO 2014-02-19 03:34 nefunkční čidlo tlaku\\ 
-**580 SELHANI PROCESORU 8**\\ +**202 OK**\\ 
-Magdaleno OPRAVIT 8\\ +INFO 2014-02-19 03:35 blíží se jiný robot\\ 
-**240 OK (12,7)**\\ +**202 OK**\\ 
-Magdaleno KROK\\ +INFO 2014-02-19 03:38 jiný robot atakovánzískáno čidlo tlaku\\ 
-**580 SELHANI PROCESORU 3**\\ +**202 OK**\\ 
-Magdaleno OPRAVIT 3\\ +FOTO 3068 .....3068 bytu dat + byty kontrolního součtu.....\\ 
-**240 OK (12,7)**\\ +**202 OK**\\ 
-Magdaleno KROK\\ +//^]q\\ 
-**240 OK (11,7)**\\ +\\ 
-Magdaleno KROK\\ +telnet> q\\ 
-**580 SELHANI PROCESORU 3**\\ +Connection closed.\\
-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\\ +
-**210 USPECH Kobyla ma maly bok.**\\ +
-//Connection to baryk.felk.cvut.cz closed by foreign host.\\+
 xsmitka@fray1:/home/zam/xsmitka>// xsmitka@fray1:/home/zam/xsmitka>//
 +
 +Komentář: Spojení se v telnetu ukončí Ctrl+] a potom q a ENTER.
 +
 +__Jiný příklad:__
 +
 +//xsmitka@fray1:/home/zam/xsmitka>telnet baryk.fit.cvut.cz 3999\\
 +Trying 147.32.232.173...\\
 +Connected to baryk.fit.cvut.cz.\\
 +Escape character is '^]'.//\\
 +**200 LOGIN**\\
 +Robot Karel\\
 +**201 PASSWORD**\\
 +1045\\
 +**202 OK**\\
 +INFO 2014-02-19 03:34 nefunkční čidlo tlaku\\
 +**202 OK**\\
 +INFOblablabla\\
 +**501 SYNTAX ERROR**\\
 +//Connection closed by foreign host.\\
 +xsmitka@fray1:/home/zam/xsmitka>//
 +
 +
 +===== Uživatelská jména a hesla =====
 +Jednotliví roboti se musí přihlásit svým jménem a heslem. Protože sonda nemůže znát všechny roboty (někteří mohou být vyrobeni později než sonda), bylo rozhodnuto, že přihlašovací jména a hesla budou mít následující tvar:
 +
 +Uživatelské jméno: ''Robot'' //<libovolný řetězec neobsahující sekvenci \r\n>//\\
 +Heslo: //<součet hodnot jednotlivých bytů uživatelského jména zapsaných v dekadické formě>//
 +
 +Příklad: Robot345 / 674
  
 ===== Požadavky ===== ===== Požadavky =====
-    * programuje se jak klientská, tak serverová část, +    * programuje se pouze serverová část (nikoliv klientitedy roboti), 
-    * klient umí vyzvednout tajemství zcela automaticky bez zásahu člověka (během celého spojení),   +    * server musí 100% fungovat s klientem na serveru baryk-ng.felk.cvut.cz (viz níže),
-    * 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),     * 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, +    * server 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), +    * program by mě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+    * použitý port se zadává jako parametr v příkazové řádce při spuštění klienta (tzn. že hodnota portu není konstantou 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),     * 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,     * 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++.     * 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.+    * při implementaci pište vše **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 [[priklady|příklady programů]].     * 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 [[priklady|příklady programů]].
-    * po spuštění se program musí rozhodnout, zda je server nebo klient, a to podle parametrů v příkazové řádce:+    * po spuštění si program musí načíst z příkazové řádky číslo portu:
 === === === ===
-role klienta:  ''./robot <server> <port>'' \\ + ''./robot <port>'' \\ 
-role serveru:  ''./robot <port>'' \\ +kde //<port>// je číslo portu, na kterém server naslouchá.
-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).+    * každý student má **povinnost průběžně uploadovat aktuální stav svého zdrojového kódu** přes WWW rozhraní serveru baryk-ng.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).
  
 ===== Implementační poznámky ===== ===== Implementační poznámky =====
     * **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ý.**     * **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 [[http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()|Javadoc - BufferedReader.readLine()]]. +    * Používejte metody, které znáte a víte přesně, co dělají. BufferedReader.readLine() se pro server opravdu nehodí, viz [[http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()|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. [[vyuka:psi:cviceni:rychlost-io-java|malý test]] rychlosti.+ 
  
 ===== Testování ===== ===== Testování =====
  
 ==== Testování klienta ==== ==== Testování klienta ====
-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:\\ +Referenční server pro první úlohu běží na adrese baryk-ng.felk.cvut.cz na portu 3999. Funkčnost serveru lze ověřit zadáním příkazu:\\ 
-''telnet baryk.felk.cvut.cz 3999''+''telnet baryk-ng.felk.cvut.cz 3999''
  
 ==== Testování serveru ==== ==== Testování serveru ====
Line 209: Line 276:
 |Java    |''javac source.java''  | |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.+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-ng.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.
  
-===== Termín a způsob odevzdání ===== +K dispozici máte [[uloha1-faq|seznam nejčastějších chyb]]které mohou při testování nastata 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.+===== Způsob odevzdání =====
  
-Odevzdat lze pouze takovou úlohu, která: +Za každý týden prodlení je penalizace -0,5 bodu (jako přelom týdne se počítá konec cvičení). **Odevzdání je možné pouze do uvedeného deadline.**  
-  * je přeložitelná na serveru baryk.felk.cvut.cz + 
-  * komunikuje se serverem baryk.felk.cvut.cz (v ípadě klienta; stačí otevřít spojení a přijmout úvodní zprávu 200) +Odevzdat lze pouze takovou úlohu, která splňuje minimální požadavky (za 0 bodů)
-  * 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 200)+  * je přeložitelná na serveru baryk-ng.felk.cvut.cz 
 +  * dokáže ijmout spojení od klienta a přijmout jeho uživatelské jméno)
  
 Postup odevzdání: Postup odevzdání:
-  - otestujte svoje řešení proti serveru Baryk (klienta i server) i svého klienta a servera proti sobě+  - otestujte svoje řešení proti klientovi na serveru Baryk
   - připravte si zdrojové texty k nahlédnutí   - připravte si zdrojové texty k nahlédnutí
   - připravte si internetový prohlížeč na server Baryk a připravte se na překlad zdrojového kódu   - připravte si internetový prohlížeč na server Baryk a připravte se na překlad zdrojového kódu
Line 229: Line 296:
  
 ===== Bodování ===== ===== Bodování =====
-Za odevzdání automaticky získáváte 8 bodů, ze kterých Vám může být stržena penalizace+Za úlohu můžete dostat max. 14 bodů. Penalizace: 
-  * server nezpracovává požadavky klienta paralelně: -2 +  * každý test, který neprojde-3 
-  * chybně implementovaný protokol na straně klienta: -+  * server nezpracovává požadavky klienta paralelně: -5 
-  * chybně implementovaný protokol na straně serveru: -3 +  * chybně implementovaný protokol: -7 
-  * nestabilita: -3 +  * nestabilita: -5 
-  * malá odolnost vůči nestandardním vstupům: -+  * malá odolnost vůči nestandardním vstupům: -5 
-  * klient nevyzvedává tajemství plně automaticky: -3 +  * chyby v programu, které se neprojevily přímo: dle povahy -1 až -8 
-  * chyby v programu, které se neprojevily přímo: dle povahy -1 až -5 +  * nečistý zdrojový kód: -2 
-  * nečistý zdrojový kód: -1 +  * zdrojový kód nebyl průběžně uploadován na server Baryk: -
-  * zdrojový kód nebyl průběžně uploadován na server Baryk: -5+  * za každý týden zpoždění (nelze odevzdat po deadline): -1 
 + 
 + 
  
 ===== Literatura ===== ===== Literatura =====
  
-[[http://karel.oldium.net|Robot Karel online]]+[[http://marsrovers.jpl.nasa.gov/home/index.html|Průzkumní roboti na Marsu]]\\ 
 +[[http://www.abicko.cz/clanek/vystrihovanky/5447/kosmicky-pruzkumny-robot-spirit.html|Motivační vystřihovánka]]
  • vyuka/psi/cviceni/uloha1-karel-zadani.1329854809.txt.gz
  • Last modified: 2012/02/21 20:06
  • by kubr