Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
vyuka:psi:cviceni:uloha1-karel-zadani [2012/02/21 20:06] – [Situace] kubr | vyuka:psi:cviceni:uloha1-karel-zadani [2019/12/05 13:14] (current) – [Bodování] kubr | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Úloha č.1 - TCP Server | + | ====== Úloha č.1 - TCP Server ====== |
===== Situace ===== | ===== Situace ===== | ||
- | Robot Karel se pohybuje po městě. Město tvoří 2-D plocha rozdělená | + | Na planetě Mars bylo vypuštěno několik průzkumných robotů. Roboti posílají informace ze senzorů a fotografie okolí |
- | Robot se může pohybovat pouze ve městě, mimo město havaruje. Město má rozměr 43 x 43 polí, souřadnice //x// a //y// mohou nabývat hodnot z intervalu <// | + | Bohužel však nejsou roboti na povrchu planety sami. Na komunikační server na družici se neustále kdosi pokouší připojovat, prolámat ochrany a server kompromitovat. Nevíme, zda se jedná o konkurenci nebo o cizí formu života, v každém případě je třeba server chránit |
- | Na pozici (0,0) je značka. Úkol robota je dojít ke značce, zvednout ji a přečíst tajemství. | + | Implementujte server běžící na družici, který bude od robotů |
===== Obecné schema komunikace ===== | ===== Obecné schema komunikace ===== | ||
- | Server představuje robota, kterého ovládá klient. Využívá se komunikačního protokolu | + | Komunikační protokol je postaven nad transportním protokolem |
- | Po navázání spojení klientem | + | Server očekává, že se k němu budou připojovat jednotliví klienti (roboti). Server si po navázání spojení klientem |
- | 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ě. | + | < |
+ | | ||
- | ===== Struktura dat ===== | + | ---------- connect -----------> |
+ | server si vyžádá zadání | ||
+ | uživatelského jména | ||
+ | < | ||
+ | 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) | ||
+ | < | ||
+ | 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. | ||
+ | < | ||
+ | close() | ||
+ | |||
+ | NEBO | ||
- | === Příkazy === | + | Pokud prošla kontrola |
+ | bez chyby, bude odeslána | ||
+ | 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: **// | + | odeslána 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. | ||
+ | < | ||
+ | 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. | + | |
- | Struktura: ''// | + | |
- | kde // | + | |
- | ^odpověď^vysvětlení^ | + | součet nesedí, bude |
- | |200 //Text pozdravu robota// | + | |
- | |210 USPECH //Text tajemství// | + | spojení nebude |
- | |240 OK (//x//,// | + | ukončeno, zpráva však |
- | |500 NEZNAMY PRIKAZ | + | nebude uložena na disk. |
- | |530 HAVARIE | + | |
- | |550 NELZE ZVEDNOUT ZNACKU | + | Jinak bude fotografie |
- | |571 PROCESOR FUNGUJE | + | uložena na disk a |
- | |572 ROBOT SE ROZPADL | + | |
- | |580 SELHANI PROCESORU //x// | + | 202. |
- | Po odeslání odpovědí s kódem 210, | + | |
+ | Robot pokračuje | ||
+ | v odesílání zpráv | ||
+ | I a F, nakonec | ||
+ | spojení | ||
- | V textu pozdravu robota | + | close() |
+ | Server reaguje | ||
+ | uzavřením spojení | ||
- | V případě serveru není povoleno rekurzivní vnořování konstrukce " | + | close() |
- | * '' | + | </code> |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | + | ||
- | 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: '' | + | |
- | 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ý, | + | |
- | Kódy možných odpovědí: 240, | + | |
- | == Příkaz VLEVO == | + | ==== Zprávy poslané klientem ==== |
- | Syntaxe: '' | + | |
- | 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: | + | | **U** |uživatelské jméno robota |
- | Význam: Zvedne značku. Pokud není robot na souřadnici | + | | **P** |heslo robota |
- | Oslovení je třeba zjistit z odpovědi 200.\\ | + | | **I** |informace ze senzorů |
- | Kódy možných odpovědí: 210,550 | + | | **F** |fotografie okolí |
- | == Příkaz OPRAVIT | + | ===Poznámky ke zprávě I=== |
- | Syntaxe: '' | + | |
- | 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é příkazy robot nezná. Na chybně zadané příkazy server reaguje odpovědí s kódem | + | Za klíčovým slovem INFO následuje mezera a poté libovolný řetězec znaků neobsahující '' |
+ | |||
+ | //Příklad zprávy I:// | ||
+ | < | ||
+ | INFO Teplotní senzor č.3 se porouchal.\r\n | ||
+ | </ | ||
+ | |||
+ | ===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 | ||
+ | |||
+ | 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 " | ||
+ | |||
+ | **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:// | ||
+ | < | ||
+ | FOTO 2775 @xfv8aw**< | ||
+ | </ | ||
+ | |||
+ | //Příklad krátké zprávy F pro demonstraci výpočtu kontrolního součtu:// | ||
+ | < | ||
+ | FOTO 8 ABCDEFGH\x00\x00\x02\x24 | ||
+ | </ | ||
+ | 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> < | ||
+ | |||
+ | ==== Zprávy poslané serverem ==== | ||
+ | |||
+ | ^zpráva^význam^syntaxe^ | ||
+ | | **200** | ||
+ | | **201** | ||
+ | | **202** | ||
+ | | **300** | ||
+ | | **500** |neplatné uživatelské jméno nebo heslo |'' | ||
+ | | **501** | ||
+ | | **502** | ||
+ | |||
+ | 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 ===== | ||
// | // | ||
- | **tučně** = server (robot)\\ | + | **tučně** = server (družice)\\ |
- | normálně = klient\\ | + | normálně = klient |
+ | Sekvence '' | ||
- | // | + | // |
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án, získáno čidlo tlaku\\ |
- | **580 SELHANI PROCESORU 3**\\ | + | **202 OK**\\ |
- | Magdaleno OPRAVIT 3\\ | + | FOTO 3068 .....3068 bytu dat + 4 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, | + | |
- | Magdaleno KROK\\ | + | |
- | **580 SELHANI PROCESORU 9**\\ | + | |
- | Magdaleno OPRAVIT 9\\ | + | |
- | **240 OK (10, | + | |
- | 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 | + | |
xsmitka@fray1:/ | xsmitka@fray1:/ | ||
+ | |||
+ | Komentář: Spojení se v telnetu ukončí Ctrl+] a potom q a ENTER. | ||
+ | |||
+ | __Jiný příklad: | ||
+ | |||
+ | // | ||
+ | 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**\\ | ||
+ | // | ||
+ | xsmitka@fray1:/ | ||
+ | |||
+ | |||
+ | ===== 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: '' | ||
+ | Heslo: //< | ||
+ | |||
+ | Příklad: Robot345 / 674 | ||
===== Požadavky ===== | ===== Požadavky ===== | ||
- | * programuje se jak klientská, tak serverová část, | + | * programuje se pouze serverová část |
- | * klient umí vyzvednout tajemství zcela automaticky bez zásahu člověka (během celého spojení), | + | * server |
- | * klientská i serverová část | + | |
* 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 | + | * server musí být stabilní a odolný |
- | * programy | + | * program |
- | * IP adresa nebo DNS jméno serveru a port se zadávají | + | * použitý |
- | * 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ý, | * zdrojový text musí být komentovaný, | ||
* povolené programovací jazyky jsou následující: | * povolené programovací jazyky jsou následující: | ||
- | * při implementaci pište | + | * při implementaci pište |
* pokud použijete jazyk Java, napište na začátek zdrojového textu **'' | * pokud použijete jazyk Java, napište na začátek zdrojového textu **'' | ||
- | * po spuštění | + | * po spuštění |
=== === | === === | ||
- | role klienta: | + | '' |
- | role serveru: | + | kde //< |
- | kde //< | + | |
===== ===== | ===== ===== | ||
- | * 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á, | + | * 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á, |
===== Implementační poznámky ===== | ===== Implementační poznámky ===== | ||
* **nepoužívejte pro komunikaci metodu '' | * **nepoužívejte pro komunikaci metodu '' | ||
- | * Používejte metody, které znáte a víte přesně, co dělají. BufferedReader.readLine() se pro server opravdu nehodí, viz [[http:// | + | * Používejte metody, které znáte a víte přesně, co dělají. BufferedReader.readLine() se pro server opravdu nehodí, viz [[http:// |
- | * Dejte si pozor na časovou složitost IO operací, i když se to nezdá, mohou výrazně zpomalit běh programu, viz. [[vyuka: | + | |
===== 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: |
- | '' | + | '' |
==== Testování serveru ==== | ==== Testování serveru ==== | ||
Line 209: | Line 276: | ||
|Java |'' | |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:// | + | 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:// |
- | ===== 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í 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. | + | ===== 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 případě | + | Odevzdat lze pouze takovou úlohu, která |
- | * 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 | ||
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 |
- | * server nezpracovává požadavky klienta paralelně: -2 | + | * každý test, který neprojde: -3 |
- | * chybně implementovaný protokol | + | * server nezpracovává požadavky klienta paralelně: -5 |
- | * chybně implementovaný protokol na straně serveru: -3 | + | * chybně implementovaný protokol: -7 |
- | * nestabilita: | + | * nestabilita: |
- | * malá odolnost vůči nestandardním vstupům: -3 | + | * malá odolnost vůči nestandardním vstupům: -5 |
- | * klient nevyzvedává tajemství plně automaticky: | + | * 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: -7 |
- | * 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/ |
+ | [[http:// |