Készítsünk egy, a BitTorrenthez hasonló alkalmazást. Az alkalmazás segítségével szövegfájlokat lehessen megosztani, amelyeket az alkalmazás darabokban átad a kapcsolódó kliensek számára. Kipróbálásra szabadon elérhető szövegeket ajánlok, pl. http://mek.oszk.hu/ vagy http://www.gutenberg.org/wiki/Main_Page, vagy véletlenszerűen generált, hosszú szövegeket. A rendszer kétfajta szervert tartalmaz. Az egyik szerverfajta minden egyes kliens számítógépén fut, ezek tartalmazzák a megosztott fájlok darabjait. Ezeket a szervereket peer szervereknek is szokás nevezni. A másik fajta szerverből csak egyetlen példány fut, amelynek címét és portját mindegyik peer ismeri. Ez a szerver a tracker, amely azt tartja számon, hogy az egyes peerek melyik fájlok melyik darabjait tartalmazzák. Mindkét fajta szerver készítsen naplót (logPeer.txt, logTracker.txt), amibe minden, az alábbiakban ismertetett történést jegyezzen fel. Mindkét szerverfajta indítson el kezdetben egy szervert; a peerek az 13467 porton, a tracker a 13468 porton. Mindkét fajta szervernek párhuzamosan több kapcsolatot is fogadnia kell. A kommunikáció minden esetben sor alapú. A felhasználók kapcsolódhatnak a lokális gépen futó peerjük 13467 portjára, és azon parancsokat adhatnak ki a számára. Ennek hatására a peer kommunikálni kezd a trackerrel és a többi peer szerverrel az alább leírt módon. A tracker azonkívül, hogy a peerek üzeneteit fogadja, periodikusan (pl. 30 mp időközönként) ellenőrzi, hogy az általa ismert peerek még működnek-e ("ping" üzenet). Az időközben kikapcsolt szerverek bejegyzéseit eltávolítja. Peer (felhasználótól várt üzenetek) - newfile - feltételezhető, hogy csak a latin ábécé betűit és pontot tartalmaz, pl. szóköz, távol-keleti karaktereket nem - ha nem érhető el a fájl, akkor hibajelzést küld válaszként - a szerver új torrentet készít -ből - felbontja a fájlt 500 soros részekre (az utolsó darab lehet rövidebb) - a darabok 0-tól sorszámozódnak - minden darabhoz kiszámít egy hash kódot: a benne szereplő karakterek kódjainak összegét (egyszerűen char-ként összeadva), a sorvége jeleket figyelmen kívül hagyva - a szerver bejelenti a fájlt a trackeren: egy "reg" üzenetet küld (leírását lásd lent) - getfile - lekéri a trackertől azokat a peereket, akiknek megvannak részek a fájlból ("getpeersforfile" üzenet) - elkezdi letölteni a fájl darabjait - véletlenszerűen választ egy olyan peert és részt, amelyik még nincsen letöltve - elindít egy új szálat, ami kapcsolódik a peerhez, és elküldi a megfelelő "getpart" üzenetet - megvárja a választ - a válaszban kapott résznek ellenőrzi a hash kódját - ha a hash kód rendben van, feljegyzi az új darabot az ismertek közé - bejelenti a trackernek is, hogy ismeri az új darabot ("reg" üzenet) - ha a fájlnak minden darabja megérkezett, akkor kiírja a fájlrendszerbe - getfiles - lekéri a trackertől az általa ismert fájlokat ("getfiles" üzenet), és a választ továbbítja a felhasználónak - status - kiírja a felhasználó számára a következő információkat - a szerverről letöltő peerek (melyik fájl melyik részét) - a szerverre feltöltő peerek (melyik fájl melyik részét) - a szerveren megtalálható fájlok és fájlrészek - stopserver - a szerver nem fogad további kapcsolatokat - a futó kapcsolatokat még kiszolgálja Peer (másik peertől várt üzenetek) - getpart - válasz: unknown - ha a fájlnév nem ismert a szerveren, vagy az index nem érvényes tartományba tartozik - válasz: sending <1. sor> <2. sor> ... - ha a fájlnév és az index helyes - ping - válasz: pong - ezzel jelzi a külvilág számára a szerver, hogy működik - (bármi egyéb) - ismeretlen parancs - a szerver bontja a kapcsolatot Tracker (peer szerverektől várt üzenetek) - reg <átküldött darabok száma> <1. darab sorszáma> <1. darab hash kódja> <2. darab sorszáma> <2. darab hash kódja> ... - a tracker feljegyzi, hogy a szerver ismer -ből részeket - feljegyzi, hogy a fájl hány részből áll összesen, és a hash kódot - ha már be van jegyezve a fájl, összeveti ezeket a régi bejegyzéssel - ha eltérnek, elveti az új bejegyzést - getpeersforfile - a tracker visszaküldi, hogy melyik szerverek ismernek részeket a fájlból, a következő formátumban: ... ... - getfiles - visszaküldi az ismert fájlok neveit soronként