10. cvičení - Programování internetových aplikací 1
Cíle cvičení
- Napsat HTTP klienta.
- Napsat HTTP server.
Napsat http klienta
Úkol (za 1 bod): Pro Windows nebo Linux (naopak než u chatu ze 7. cvičení, tj. v případě Windows chat serveru napsat Linux HTTP klienta) napsat HTTP klienta se syntaxí:
httpklient jmeno-pocitace port cesta-k-souboru
Pro tyto údaje program provede GET dotaz na server a vypíše:
- počet přijatých bytů
- hlavičku odpovědi
- tělo odpovědi
Například pro dotaz:
httpklient phoenix.inf.upol.cz 80 /~drymld/ps/
by mohla odpověď vypadat takto:
Prijato: 1023 bytu HTTP Hlavicka: HTTP/1.1 200 OK Date: Wed, 02 Dec 2009 09:15:47 GMT Server: Apache/1.3.34 Ben-SSL/1.55 (Debian) PHP/4.4.4-8+etch6 Last-Modified: Wed, 25 Nov 2009 12:08:53 GMT ETag: "adc380-2d0-4b0d1e55" Accept-Ranges: bytes Content-Length: 720 Connection: close Content-Type: text/html Content-Language: cs HTTP Telo: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Počítačové sítě</title> </head> <body> <h1>Počítačové sítě</h1> <h2><a href="attendance-list-results.html">Seznam účastníků / výsledky</a></h2> <h2>Seznam cvičení</h2> <ul> <li>27.10. - <a href="lab04.html">4. cvičení - Linková vrstva</a></li> <li>4.11. - <a href="lab05.html">5. cvičení - Síťová vrstva 1</a></li> <li>11.11. - <a href="lab06.html">6. cvičení - Síťová vrstva 2</a></li> <li>18.11. - <a href="lab07.html">7. cvičení - Transportní vrstva</a></li> <li>25.11. - <a href="lab08.html">8. cvičení - DNS 1</a></li> </ul> </body> </html>
k implementaci jsou potřeba struktury hostent
a sockaddr_in
a dále funkce:
struct hostent *gethostbyname(const char *name);
int socket(int __domain, int __type, int __protocol);
a hodnoty maker AF_INET, SOCK_STREAM, IPPROTO_TCPuint16_t htons(uint16_t __hostshort);
int connect(int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
ssize_t send(int __fd, __const void *__buf, size_t __n, int __flags);
ssize_t recv(int __fd, void *__buf, size_t __n, int __flags);
int close(int __fd);
A pro Windows verzi ještě strukturu WSADATA
a funkci int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
.
HTTP GET hlavička, kterou je potřeba odeslat pro získání tohoto výsledku, vypadá pro příklad výše následovně:
GET /~drymld/ps/ HTTP/1.1 Host: phoenix.inf.upol.cz Connection: close
A za ní je prazdný řádek.
Příklad TCP klienta pro Windows a Linux se dá najít na portálu builder.cz.
Napsat HTTP server
Úkol (za 1 bod): Pro Windows nebo Linux (naopak než u chatu ze 7. cvičení, tj. v případě Windows chat klienta napsat Linux HTTP server) napsat primitivní HTTP server se syntaxí:
httpserver cislo_portu koren_webu
Po spuštění s těmito parametry server začne poslouchat na zadaném portu (v Linuxu se dají pro normálního uživatele použít jen porty s vyšším číslem než 1023 na Windows je také doporučeno používat porty vyšší než 1023 a nižší než 50000).
Po přijetí následující HTTP GET hlavičky:
GET /text.txt HTTP/1.1 Host: localhost:1024 User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.5) Gecko/20091123 Iceweasel/3.5.5 (like Firefox/3.5.5; Debian-3.5.5-1) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: cs,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: UTF-8,* Keep-Alive: 300 Connection: keep-alive
Načte obsah souboru koren_webu/text.txt
a odešle ho klientovi v následujícím tvaru:
HTTP/1.1 200 OK Content-Type: text/html odesilana zprava
Za odeslanou zprávou je prázdný řádek.
Zavolat tento server je možné z WWW prohlížeče pomocí URL http://localhost:port_na_kterem_server_posloucha/text.txt
a jako odpověď by měl zobrazit obsah odesílané zprávy jako HTML.
Stačí aby byl server schopen správně odesílat jen textové soubory. V případě že požadovaný soubor neexistuje, pošle odpověď s kódem 404:
HTTP/1.1 404 Not Found Content-Type: text/html soubor nenalezen
Za odeslanou zprávou je prázdný řádek.
Další informace k TCP serveru, se dají najít pro Windows a pro Linux na serveru www.builder.cz.