|
|
| (ei näidata sama kasutaja 4 vahepealset redaktsiooni) |
| 1. rida: |
1. rida: |
| Sisuliselt sama ülesanne väikeste nüansivahedega on olemas [[Vorgurakendused 2 prax 1|2010 ja 2011 aasta arhiivis]].
| |
| [[Võrgurakendused 2012 prax 1 |arhiivis]]
| |
|
| |
|
| Ülesandeks on ehitada P2P rakendus nimega [[http://www.youtube.com/watch?v=GCZ4rhE6pww wazaa]] failide otsimiseks võõrastest masinatest, mis leiab teisi kasutajaid ise tehtud P2P mehhanismi abil.
| |
|
| |
| Kasutajaliidese hea kvaliteet ei ole praksis oluline.
| |
|
| |
| == Üldkirjeldus ==
| |
|
| |
| Wazaa võimaldab:
| |
|
| |
| * kasutajal otsida võõrastest masinatest faile failinimes sisalduva stringi (näiteks "Film1") järgi.
| |
| ** Seejuures otsitakse ainult wazaa kataloogis olevaid faile, mitte ei otsita kogu masinat läbi. wazaa kataloogis ei ole alamkatalooge.
| |
| ** Leitud failid kuvatakse loetelus, kus on võõra masina IP, port ja terviklik failinimi.
| |
|
| |
| * kasutajal tõmmata endale faili kuvatud loetelust, teades masina IP-d, porti ja failinime.
| |
|
| |
| Failide leidmiseks kasutab wazaa järgmist viisi:
| |
|
| |
| * Saadab tema oma masinas oleva faili machines.txt masinatele failiotsingu päringu. machines.txt sees on masinate ip ja pordid json listina kujul
| |
| <pre>
| |
| [["11.22.33.44","2345"],...,["111.222.333.444","23456"]]
| |
| </pre>
| |
|
| |
| * Samamoodi saadab failiotsingu-päringu wazaa startlehel http://dijkstra.cs.ttu.ee/~tammet/wazaa.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)
| |
|
| |
| * Kui mingi masin leiab minu otsitud faili, siis ta saadab mulle teate, et mis IP ja pordiga masin ja mis täisnimega fail on.
| |
|
| |
|
| |
| Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.
| |
|
| |
| == Tehnilised nõuded ==
| |
|
| |
| Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:
| |
| * Kogu programm peab töötama kas AK klassi arvutis või teie oma läptopis, mis AK klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi.
| |
| * Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit "suurt" http serverit a la apache kasutada ei või.
| |
|
| |
|
| |
| == Protokoll ==
| |
|
| |
| Konkreetselt masinalt 11.22.33.44 kus wazaa jookseb pordis 2345 sobivate failide pärimine:
| |
|
| |
| <pre>
| |
| http://11.22.33.44:2345/searchfile?name=filename&sendip=55.66.77.88&sendport=6788&ttl=5&id=wqeqwe23&noask=11.22.33.44_111.222.333.444 ...
| |
| </pre>
| |
|
| |
| kus parameetritel on järgmine sisu:
| |
|
| |
| * name: otsitav string (peab olema failinimes)
| |
| * sendip: esialgse otsija ip
| |
| * sendport: esialgse otsija port
| |
| * ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)
| |
| * id: optsionaalne päringu identifikaator
| |
| * noask: optsionaalne list masinatest, kellelt pole mõtet küsida (eraldajaks alakriips)
| |
|
| |
| Päringu vastuseks on õnnestunud päringu korral number 0,
| |
| ebaõnnestunud päringu korral muu (vea)number.
| |
|
| |
| Leitud failist teadaandmine:
| |
|
| |
| post call urlile
| |
|
| |
| <pre>
| |
| http://11.22.33.44:2345/foundfile
| |
| </pre>
| |
| kus post päringu sisu (peale headeris olevat tühikut) on
| |
| json formaadis list failide täisnimedega a la
| |
| <pre>
| |
| { "id": "wqeqwe23",
| |
| "files":
| |
| [
| |
| {"ip":"11.22.33.66", "port":"5678", "name":"minufail1.txt"},
| |
| ...
| |
| {"ip":"11.22.33.68", "port":"5678", "name":"xxfail1yy.txt"}
| |
| ]
| |
| }
| |
| </pre>
| |
|
| |
|
| |
| kus elementidel on järgmine sisu:
| |
|
| |
| * id: esialgse päringu id (kui oli algselt antud)
| |
| * name: täispikk leitud faili nimi
| |
| * ip: masina ip, kus antud fail asub
| |
| * port: masina wazaa port, kus antud fail asub
| |
|
| |
| Postituse saaja vastab eduka kättesaamise korral arvu 0,
| |
| arusaamatuste korral mõne muu (vea) numbri.
| |
|
| |
| Konkreetselt masinalt 11.22.33.44 kus wazaa jookseb pordis 2345 konkreetse faili pärimine:
| |
|
| |
| <pre>
| |
| http://11.22.33.44:2345/getfile?fullname=fullfilename
| |
| </pre>
| |
|
| |
| Viimasele, getfile päringule vastatakse faili saatmisega üle http protokolli (st headeris on kindlasti ka content-length ja mime type).
| |
|
| |
| == Praksi kaks osa ==
| |
|
| |
| Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:
| |
|
| |
| * Teha http protokolli järgida suutev esmane rakendus.
| |
| * Lisada sinna kogu vajalik funktsionaalsus.
| |
|
| |
| Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.
| |
|
| |
| == Soovitusi ja ideid ==
| |
|
| |
| Wazaa peab päris kindlasti sisaldama või kasutama http serverit,
| |
| muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.
| |
|
| |
| Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.
| |
|
| |
| C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks
| |
| on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,
| |
| ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja
| |
| [http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].
| |
|
| |
| Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.
| |
|
| |
| Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).
| |
|
| |
| Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:
| |
|
| |
| * [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]
| |
| * [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]
| |
| * [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)]
| |
| * [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]
| |
| * [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]
| |
| * [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]
| |
| * [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]
| |
| * [http://tomayko.com/writings/unicorn-is-unix ruby]
| |
| * [http://jacobian.org/writing/python-is-unix/ python]
| |
| * [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]
| |
| * [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]
| |
| <!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] -->
| |
|
| |
| == Firewall ja NAT ==
| |
|
| |
| Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).
| |
|
| |
| Kes chati käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte.
| |
|
| |
| Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:
| |
| * Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.
| |
| * UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid]. Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]
| |
|
| |
| NB! Seda kõike ei ole väga lihtne teha ja sinu chatiklient (ja ka selle inimese chatiklient, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne chat veel ei tööta!
| |
|
| |
| Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma chatiproge jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!
| |
|
| |
| == Punktiarvestusest ==
| |
|
| |
| Kui kõik eelnimetatu töötab vastu mõne teise grupi wazaad ja
| |
| koodi suudetakse seletada, saab täispunktid.
| |
|
| |
| Kui teiste wazaa-programmidega eriti ei suuda suhelda, aga iseenda koopiatega siiski, saab miinuspunkte.
| |
|
| |
| Oma lisa-asjade ehitamise ja töötamise demo korral (mitme kasutaja chat vms) saab täispunktidele lisaks
| |
| lisapunkte.
| |