Tartalmi kivonat
Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon Tartalomjegyzék 1. Bevezetés 3 2. A felhasznált technológiák rövid áttekintése 4 2.1 A Napster bemutatása 4 2.2 A hálózati programozás rövid bemutatása Java környezetben 5 3. Az alkalmazás specifikációja 7 3.1 Analízis 7 3.2 Használati esetek 8 3.3 Fogalom szótár 9 3.4 Forgatókönyvek 10 3.5 Felhasználói felület megtervezése 14 4. Rendszertervezés 16 4.1 A kliens oldal funkciók szerinti részekre bontása 16 4.2 A kliensen belüli kommunikációs- és GUI rész kapcsolat tartása 17 4.3 A kliens oldali GUI rész alegységekre bontása 18 4.4 A kliens és a szerver kommunikációja 19 4.5 A szerver mőködés szerinti részekre bontása 19 5. Osztálytervezés és az osztályok megvalósítása 20 5.1 A szerver oldal csomag- és osztálydiagramjának ismertetése 20 5.2 A szerver oldal osztályainak és metódusainak ismertetése 21 5.3 A kliens oldal
csomag- és osztálydiagramjának ismertetése 23 5.4 A kliens oldal osztályainak és metódusainak ismertetése 24 5.41 Az interfaces csomag interfészeinek ismertetése 25 5.42 Az gui csomag osztályainak ismertetése 26 5.43 A panels csomag osztályainak ismertetése 34 5.44 Az exception csomag osztályainak ismertetése 37 5.45 A connection csomag osztályainak ismertetése 38 6. Tesztelés 42 6.1 Installációs teszt 42 6.2 Általános funkcionális teszt 42 6.3 Szélsıérték funkcionális teszt 42 6.4 Hálózatban történı tesztelés 42 1 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7. Felhasználói dokumentáció 43 7.1 A program rendszerkövetelményei 43 7.2 Az installálás bemutatása 43 7.21 A futtatókörnyezet telepítése 43 7.22 A szerver alkalmazás telepítése 44 7.23 A kliens alkalmazás telepítése 47 7.3 A kliens program használata 49 7.31 Beállítások 49 7.32 Bejelentkezés,
Kijelentkezés 52 7.33 Publikus és Privát chatelés 53 7.34 Fájlkeresés 55 7.35 Fájl lista letöltés 56 7.36 Fájl letöltés 57 8. Összefoglalás 59 9. A fejlesztés során felhasznált eszközök 60 10. Irodalomjegyzék 60 11. Mellékletek jegyzéke 62 2 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 1. Bevezetés Egyre többet lehet arról hallani, hogy sokan a fájlcserélı programokkal illegálisan zenéket és filmeket töltenek le a számítógépükre. Azonban arról már kevesebb hír szól, hogy mennyire hasznosak lehetnek számunkra, ha legális célokra használjuk ıket. A fájlcserélı programok használatával, például sokkal gyorsabban megtalálhatunk egy dokumentumot, esetleg egy freeware programot. Nem találkozunk folyton hibás hivatkozásokkal, és nem kell hosszasan keresgélni, hogy honnan is tölthetünk le egy fájlt. Nem kell külön letöltési managereket használnuk, hogy egy
letöltés megszakadása esetén folytathassuk a fájl letöltését. Fıként ezek az elınyök, és a hálózati programozással való megismerkedés miatt választottam ezt a témát, vagyis egy fájl cserélı program elkészítését Java környezetben. A Java nyelvre azért esett a választásom, mert összehasonlítva más nyelvekkel, véleményem szerint a Java fejlesztıi megtalálták az arany középutat a sebesség, a biztonság és a hordozhatóság között, és szerintem pont ezeknek az ismérveknek a támogatása fontos egy mai modern programozási nyelvben. A szakdolgozatom célja, hogy alapos tervezés után megírjak egy olyan fájl cserélı programot, ami alkalmas lesz: fájlok megkeresésére és letöltésére, publikus és privát chatelésre a kapcsolódott felhasználók között. A szakdolgozat nemcsak a kliens rész, hanem a szerver oldal részletes megtervezésére és megvalósítására is kiterjed. A kliensszerver struktúrában a Napster
architektúrára fogok támaszkodni, ugyanis egyszerő a felépítése, valamint a fájlokat is gyorsan és hatékonyan megtalálja. 3 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 2. A felhasznált technológiák rövid áttekintése 2.1 A Napster bemutatása A Napster egy fájl cserélı rendszer, aminek 1999 júniusában jelentették meg elsı béta verzióját. Pár hónappal késıbb a Napster megkapta a „Download of the Year” címet, ez fıleg annak volt köszönhetı, hogy sokan törvényellenes zene letöltésére használták. A zeneipar persze ezt nem nézte jó szemmel, és beperelte a Napstert szerzıi jogsértés miatt. Azóta a Napster egy kereskedelmi fájlcserélı platformként mőködik. (1. ábra) Napster architektúra szemléltetése [6] A Napster felépítését tekintve kliens-szerver struktúrát követ (1. ábra), ahol is a szerver tárolja a résztvevı kliensek adatait, valamint a kliensek által
megosztott fájlok listáját. A kliensek be és kijelentkezése is a szerveren keresztül történik, azaz a szerver egy központi felügyelı szerepet lát el. A kliensek bejelentkezés után állandó kapcsolatban maradnak a szerverrel a kijelentkezés végéig. Egy fájl letöltésekor, a kliens elküldi a fájl nevét a szervernek, a szerver megkeresi a fájlt a résztvevıknél, majd válaszol a kliensnek, hogy kinél (birtokló kliensek) találta meg a fájlt. A kérdezı kliens ezután letölti a fájlt az egyik birtokló klienstıl. Fontos hogy a fájl letöltése nem a szerveren keresztül történik, hanem az egyik kliens a másik klienstıl tölti le a fájlt, ezzel is csökkentve a szerver terhelését. 4 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs Ebbıl is látszik, hogy minden kliens egyben szerver is, azonban a letöltéstıl eltekintve mégsem tekinthetı teljesen peer–to-peer hálózati megoldásnak, a
központi szerver jelenléte miatt. Az architektúra hátrányaihoz sorolhatjuk, hogy egy esetleges DOS (Denial-of-Service) támadással könnyen leterhelhetı a szerver, és ez a rendszer teljes leállásához is vezethet. Valamint fontos hogy a Napster nem skálázható, azaz növekvı résztvevı számmal rosszabbodik a kiszolgálás. Azonban ezeknek az érveknek az ellenére, mégis a Napster szerkezetét találtam a legalkalmasabbnak az egyszerő felépítése, valamint a gyors és hatékony fájlkeresése miatt. [5][6] 2.2 A hálózati programozás rövid bemutatása Java környezetben A hálózati kommunikáció socketek segítségével történik. A socketek alacsony szintő programozási interfészt nyújtanak a hálózati kommunikációhoz, és a hozzájuk főzıdı Java osztályokkal elérhetjük az alapvetı hálózati protokollokat. Alapvetıen két fajta szállítási protokoll létezik: a kapcsolat nélküli (UDP), és a kapcsolat-orientált (TCP). A fájlcserélı
programban a kapcsolat-orientált protokollt fogom használni, ugyanis ez egy megbízható összeköttetést hoz létre a két végpont között. Egy kapcsolat létrehozásához fontos az egyértelmő azonosítás a hálózaton belül, amihez egy IP cím és egy port szükséges. A kapcsolat létrejötte után a hálózaton történı kommunikáció, a socketektıl elkért folyamok segítségével lesz megoldható. A hálózati kommunikációval kapcsolatos osztályokat, a java.net csomag tartalmazza Egy összeköttetés alapú szerver mőködése: Szerver mőködése 1. Java megvalósítás A szerver lefoglal egy kommunikációs végpontot a 25-ös porton. ServerSocket servSock=new ServerSocket (25); 2. A szerver várakozik egy kliens kapcsolat létesítésére Socket clientSock = servSockaccept(); InputStream is=clientSock.getInputStream(); 3. Folyamok elkérése a socket-tıl OutputStream os=clientSock.getOutputStream(); 4. Kommunikáció a klienssel is.read(); oswrite(99);
5. Folyamok lezárása ServSock.close(); isclose(); osclose(); 5 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs Egy összeköttetés alapú kliens mőködése: Kliens mőködése 1. Java megvalósítás A kliens lefoglal egy kommunikációs végpontot, és kapcsolódik a szerverhez Socket kliensSock=new Socket(”localhost”,25); InputStream is=kliensSock.getInputStream(); 2. Folyamok elkérése a socket-tıl OutputStream os=kliensSock.getOutputStream(); 3. Az elkért folyamokkal történı kommunikáció is.read(); oswrite(99); 4. Folyamok lezárása KliensSock.close(); isclose(); osclose(); (2. ábra) Kliensek kapcsolódása a szerverhez [3] A fájlcserélı alkalmazásban azonban egyszerre több kliens is kapcsolódhat a szerverhez, ezt a (2. ábra) mutatja be A kliensek csatlakozását a szerver oldal ServerSocket-jének accept() metódusa várja. Amikor egy kliens felveszi a kapcsolatot a szerverrel, akkor a
szerver egy új Socket-et készít, amit a szerver a klienssel való további kommunikációra fog felhasználni. Az elkészült Socket átadódik egy programszálnak, ami lebonyolítja a klienssel való kommunikációt, eközben a szerver újból elkezd várakozni, a csatlakozni kívánó kliensek kérelmeire. [1][3][4] 6 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs 3. Az alkalmazás specifikációja 3.1 Analízis Az analízis során megtörténik a program mőködésének leírása, és az alkalmazással kapcsolatos követelmények feltárása. A feladat, egy fájlcserélı program szerver és a kliens részének megvalósítása. A kliensek bejelentkezéskor a szerverhez csatlakoznak, és kijelentkezésig a kapcsolatot fenntartják a szerverrel. Bejelentkezéskor, a szerver regisztrálja a kliens adatait, és annak megosztott fájljait. Miután megtörtént a bejelentkezés lehetıségünk van egy fájlra rákeresni
szőrési lehetıséggel, fájl listát letölteni, és letölteni a keresett fájlt. Fontos kritérium, hogyha megszakadt egy folyamatban lévı fájl letöltése, akkor ne kelljen elölrıl kezdeni a letöltését, lehetıségünk legyen a letöltés folytatásárára. Amikor elindítunk egy letöltést, akkor az elıtőnik a mi letöltési listánkban, és a másik kliens letöltési listájában is. Nekünk letöltésként, neki feltöltésként kell hogy megjelenjen. A letöltési listában lehetıségünk van leállítani egy feltöltést, illetve letöltést, valamint rákeresni egy másik ugyanilyen nevő fájlra. A fájl letöltéshez kapcsolódó funkciókon kívül, lehetıségünk van chatelésre publikus és privát formában is. Hogy a letöltések ne terheljék le a szervert, így a fájl és fájllista letöltés nem a szerveren keresztül, hanem a kliensek között fog végbemenni. De a szerveren keresztül fog még történni a fájlkeresés és a chatelés
lebonyolítása, valamint az események naplózása is a szerver feladata. A kliens résszel szemben támasztott követelmények: Egy fájl megkeresése, különbözı szőrési lehetıségekkel Egy másik felhasználó fájl listájának letöltése Egy fájl letöltése, és a letöltés folytatása megszakadás esetén Egy letöltés illetve feltöltés megszakítása Privát chatelés egy kiválasztott felhasználóval Publikus chatelés az összes felhasználóval 7 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A szerver résszel szemben támasztott követelmények: A kliensek be és kijelentkezési kérelmeinek fogadása Fájl keresés esetén, a találatok visszaküldése Publikus és privát chatelés lebonyolítása Be és kijelentkezések naplózása 3.2 Használati esetek A diagramm megmutatja az aktor (jelen esetben a felhasználó) által kiváltható eseményeket. A
felhasználó az a személy, aki a fájlcserélı programot használja [10] (3. ábra) Használati eset diagramm 8 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs Jelmagyarázat: Asszociáció, aktor és használati eset közötti kapcsolat Kiterjesztés, többlet funkció egy használati esethez 3.3 Fogalom szótár Bejelentkezés A szerverhez történı bejelentkezés Kijelentkezés A szervertıl történı kijelentkezés Segítség Beállítások Kilépés Letöltési lista Letöltés megszakítása Segítségkérés a program használatához A bejelentkezéshez szükséges adatok megadása Kijelentkezés, majd kilépés a programból Az aktuális letöltések és feltöltések megtekintése A letöltési listából, egy feltöltés ill. letöltés megszakítása Kapcsolódott felhasználók listája A szerverhez bejelentkezett felhasználók megtekintése Publikus chat Nyilvános beszélgetés az összes
bejelentkezett klienssel Privát chat Magán beszélgetés, egy általunk kiválasztott klienssel Fájlkeresés Egy fájl megkeresése neve alapján, szőrési lehetıséggel Fájl lista letöltés Letöltési fájlkeresés Fájl letöltés Információ lekérése Ablak bezárása Egy felhasználó megosztott fájljainak listáját letölteni Egy, a letöltési listában lévı fájlra történı rákeresés Egy fájl letöltése a mi számítógépünkre Információk lekérése egy fájlról és annak tulajdonosáról Egy funkció ablak bezárása az alkalmazásban 9 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 3.4 Forgatókönyvek Bejelentkezés: 1. A felhasználó kiválasztja a bejelentkezést a menübıl, vagy az eszköztárból 2. A beállítások helyes megadása esetén, a kliensalkalmazás felveszi a kapcsolatot a szerverrel. 3. A szerver, amennyiben nem létezik még ilyen nevő kliens, felveszi a bejelentkezı
felhasználó adatait, ha létezik, akkor értesíti errıl a felhasználót. 4. A szerver az eddigi klienseknek elküldi hogy új bejelentkezı érkezett, frissítve azoknak kapcsolódott felhasználók listáját. 5. A szerver a bejelentkezı kliensnek elküldi az eddigi kliensek adatait 6. A szerveren megtörténik a bejelentkezés regisztrációja a napló állományba Kijelentkezés: 1. A felhasználó kiválasztja a kijelentkezést a menübıl, vagy az eszköztárból 2. A szervernek elküldi a kijelentkezési kérelmét a kliens 3. A szerver törli a kliens regisztrációját 4. A szerver, a bejelentkezett klienseknek elküldi hogy egy kliens kijelentkezett, frissítve azoknak kapcsolódott felhasználók listáját. 5. A szerver megerısíti, hogy sikerült a kliensnek a kijelentkezés 6. A szerveren megtörténik a kijelentkezés bejegyzése a napló állományba Segítség: 1. A felhasználó a segítség menübıl kiválasztja a megfelelı elemet 2. Megtekinti az elıugró
dialógus ablakban a szöveget 3. Bezárja az ablakot Beállítások: 1. A felhasználó kiválasztja a beállításokat a menübıl, vagy az eszköztárból 2. A baloldali menübıl a személyi beállításokat kiválasztva meg kell adni egy nick nevet, egy e-mail címet, és azt hogy milyen jellegő fájlokat osztunk meg. 10 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 3. A baloldali menübıl a kapcsolati beállításokat kiválasztva meg kell adni, a fı szerver IP címét és port-ját, a mi kliensünk szerver részének port-ját, és ha van a http proxy címet és port-ot. 4. A baloldali menübıl a letöltési beállításokat kiválasztva, meg kell adni a megosztott könyvtárakat (legalább 20 Mbyte megosztás szükséges a bejelentkezéshez), és egy letöltési könyvtárat, ahova a letöltött fájlok fognak mentésre kerülni. 5. Az OK gombot kiválasztva a felhasználó jóváhagyja, a Mégse gombra kattintva
elveti a beállításokat. Kilépés: 1. A menübıl a kilépés elem kiválasztásával, vagy az ablak bezárásával történik meg a kilépés. 2. Kijelentkezés végrehajtása, majd megtörténik az alkalmazás bezárása Letöltési lista: 1. A felhasználó megtekintheti az aktuális fel és letöltéseit, az alkalmazás alsó részén. Letöltés megszakítása: 1. A felhasználó a letöltési listából kiválaszt (jobb egér gombbal rá klikkel), egy feltöltést vagy egy letöltést. 2. A megjelenı helyi menübıl kiválasztja a leállítás menüelemet 3. A bejegyzés törlıdik a birtokló és a letöltı kliens letöltési listájából 4. A le ill feltöltés megszakítása, mindkét oldalon Kapcsolódott felhasználók listája: 1. A kliens megtekintheti a bejelentkezett felhasználók nick nevét, e-mail címét, és megosztási leírását. Publikus chat: 1. A felhasználó begépel egy üzenetet a publikus chat szövegmezıbe 2. A küld gombra klikkelve,
elküldi a szervernek az üzenetet 3. A szerver az összes bejelentkezett kliensnek elküldi ezt az üzenetet, és azt hogy ki küldte. 11 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 4. Minden bejelentkezett kliensnek megjelenik ez az üzenet, és a küldı nick neve Privát chat: 1. A felhasználó kiválaszt egy felhasználót (jobb egér gombbal rá klikkel), a kapcsolódott felhasználók listájából, egy fájlkeresés találati listából vagy egy letöltési fájlkeresés találati listából. 2. A megjelenı helyi menübıl kiválasztja a chat menüelemet 3. Amennyiben már meg van nyitva egy chat ablak ezzel a klienssel, akkor odafókuszál, ha még nincs, akkor létrehoz egy chat ablakot. 4. A felhasználó beírja az üzenetét és rá klikkel a küldés gombra 5. A szerver fogadja a privát chat kérelmet, és elküldi a megfelelı kliensnek az üzenetet, és azt hogy ki küldte. 6. Ha a másik kliensnek már van
privát chat ablaka a chatelést kezdeményezı klienssel, akkor abban megjeleníti az üzenetet, ha nincs, akkor létrehoz egy új chat ablakot, és abban jeleníti meg az üzenetet. Fájlkeresés: 1. A felhasználó kiválasztja a fájlkeresés gombot az eszköztárból 2. A megjelenı fájl keresési ablak bal oldalán lévı keresés mezıbe beírja a felhasználó a keresendı fájl nevet, vagy fájlnév töredéket. 3. A szőréseknél kiválaszthatja, hogy milyen jellegő fájlokra kíván rákeresni 4. A keres gombra való kattintással, elküldi a szervernek a keresési kérelmét 5. A szerver az eddig bejelentkezett felhasználók fájl listáját végignézi, és a találatokat visszaküldi a kliensnek. 6. A visszaküldött találatok megjelennek, a kliens fájlkeresési ablakában Fájl lista letöltés: 1. A felhasználó kiválaszt egy felhasználót (jobb egér gombbal rá klikkel), a kapcsolódott felhasználók listájából, egy fájlkeresés találati listából
vagy egy letöltési fájlkeresés találati listából 2. A megjelenı helyi menübıl kiválasztja a fájllista menüelemet 3. Amennyiben még nincs letöltve ettıl a felhasználótól a fájllista, a letöltı kliens felveszi a kapcsolatot a birtokló klienssel, ha létezik ilyen ablak, akkor oda fókuszál. 12 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 4. A fájllista letöltés regisztrálódik a letöltı kliens letöltési listájában, mint letöltés, a birtokló kliens letöltési listájában, mint feltöltés. 5. Megkezdıdik a fájllista átvitele, közben folyamatosan aktualizálódik a letöltı és birtokló kliens letöltési listája. 6. A fájllista letöltésével törlıdik a bejegyzés a letöltı és a birtokló kliens letöltési listájából. 7. A letöltı kliensnél megjelenik egy új fájllista ablak, aminek a bal oldalán lévı faszerkezetbıl kiválasztott ágak részletezve megjelennek a jobb
oldali táblázatban. Letöltési fájlkeresés: 1. A felhasználó kiválaszt egy fel ill letöltést (jobb egér gombbal rá klikkel), a letöltési listából. 2. Megjelenik egy fájlkeresési ablak, benne a kiválasztott elem nevével megegyezı keresési találatokkal, amit egy fájlkeresési esettel kértünk le. Fájl letöltés: 1. A felhasználó kiválaszt egy elemet (jobb egér gombbal rá klikkel), egy fájlkeresési találati listából, egy letöltési fájlkeresés találati listából, vagy egy fájl listából. 2. Amennyiben még nem szerepel ez a letöltés a letöltési listában akkor, felveszi a birtokló klienssel a kapcsolatot. 3. A fájl letöltés regisztrálódik a letöltı kliens letöltési listájában, mint letöltés, a birtokló kliens letöltési listájában, mint feltöltés 4. Ha már le van töltve ebbıl a fájlból, akkor azt közli a birtokló klienssel, és fájl pozicionálás után elkezdıdik a letöltés, aktualizálva mindkét fél
letöltési listáját. 5. A fájl letöltésével törlıdik a bejegyzés a letöltı és a birtokló kliens letöltési listájából. 6. A letöltött fájl helye a beállításoknál megadott letöltési könyvtár lesz Információ lekérés: 1. A felhasználó a fájl listából kiválaszt (jobb egér gombbal rá klikkel) egy elemet 2. A megjelenı helyi menübıl kiválasztja az információk menüelemet 13 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs 3. Egy új ablakban megjelennek a kiválasztott fájlról és a birtokló felhasználóról az információk. 4. A Bezárás gombra kattintva az ablak eltőnik Ablak bezárása: 1. Kiválasztjuk a bezárandó funkció ablak fülét (jobb egér gombbal rá kattintunk) 2. A megjelenı helyi menübıl kiválasztjuk a bezárás menü elemet 3.5 Felhasználói felület megtervezése A felhasználói felület vázlatos megtervezése nagyon fontos, ugyanis a felhasználó nem a
belsı mőködés, hanem a kinézet alapján fogja megítélni az alkalmazást. Ebbıl is következik a felület elkészítésekor fontos követelmény a felhasználóbarát kialakítás. (4. ábra) A kliens alkalmazás felület terve A menüsor szerkezete: Fájl menü: Bejelentkezés, Kijelentkezés, Beállítások, kilépés Segítség menü: A programról, Segítség a használathoz Az eszköztár szerkezete: Bejelentkezés, Kijelentkezés, Beállítások, Fájlkeresés A funkció ablakok lehetnek: Fı ablak, Privát chat ablak, Fájlkeresés ablak, Fájl lista ablak A letöltési lista fejléce: Típus, Felhasználó, Letöltési állapot, Sebesség, Fájl név, Méret, Cím 14 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon Funkció ablakok felületének megtervezése Fı ablak: Privát chat ablak: Fájlkeresés ablak: Fájl lista ablak: 15 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat
program, Java platformon A kliens alkalmazás elindításakor megjelenı felületet a 4. ábra mutatja be Sikeres bejelentkezés után megjelenik a fı ablak az eddig bejelentkezett felhasználókkal, valamint ezután már mi is megkapjuk és írhatunk publikus chat üzeneteket. Valamelyik klienssel történı chateléskor, egy új privát chat ablak fog megjelenni, ahol is lefolytathatjuk a beszélgetést. Fájl kereséskor egy fájlkeresés ablak, fájl lista letöltésekor pedig egy fájllista ablak fog megjelenni. Privát chat, fájlkeresés és fájllista funkció ablakokból bármennyi elıfordulhat, közöttük a funkció ablak fülekkel tudunk majd váltani. A grafikus felület kialakításakor a Swing grafikus komponens győjteményt fogom használni, mert teljesen független a grafikus felületet megjelenítı operációs rendszertıl, azaz a kinézetet nem az operációs rendszer, hanem a fejlesztı határozza meg. [8] 4. Rendszertervezés Megtörténik az alkalmazás
specifikációban körvonalazott rendszer mőködés szerinti részekre bontása, és ezeknek a részeknek az alapos kifejtése. 4.1 A kliens oldal funkciók szerinti részekre bontása (5. ábra) A kliens oldal mőködés szerinti részekre bontása 16 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A kliens oldal tervezését elıször a mőködés szerinti felosztással kezdem (5. ábra) Az ábra alapján a kliens programot két nagy részre bonthatjuk: egy kommunikációs részre, és egy grafikus felület részre. A kommunikációs részt tovább tagolhatjuk egy szerverrel kommunikáló részre (MainServerConnection), egy másik kliens felé kapcsolatot kezdeményezı részre (ConnectionStart), és egy másik kliens kapcsolódását fogadó része (ConnectionReceive). Az ábrán lévı nyilak a kapcsolat kezdeményezés irányát mutatják, a kommunikáció minden esetben kétirányú. A fı szerverhez hasonlóan, a kliens
ConnectionReceive része is egy többszálú szerver, azaz egyszerre több hozzá csatlakozó kliens letöltési kérelmét tudja fogadni. Tehát láthatjuk, hogy minden kliens egyben szerver is. A kliensek elıször mindig a központi szerverhez csatlakoznak, és csak ezután valósulhat meg a kliensek közötti kommunikáció. 4.2 A kliensen belüli kommunikációs- és GUI rész kapcsolat tartása (6. ábra) a kommunikációs- és GUI rész üzenetváltásának általános leírása 17 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs Az üzenetváltást a 6. ábra szemlélteti A kapcsolat tartás megtervezéséhez az Observer tervezési mintát vettem alapul annyi különbséggel, hogy itt a megfigyelés mindkét fél számára biztosított. Így egy kétirányú laza kapcsolatot tudtam létrehozni a kommunikációs és gui rész között anélkül, hogy függıség lenne a két osztály között.[7] A megvalósításhoz
elıször is létre kell hozni egy-egy példányt a Connection és a GUI osztályból, majd meghívjuk azok setGUI() és setConnection() metódusát, átadva paraméterül a másik osztályból létrehozott példányt. A setGUI() metódus, a gui attribútumnak értékül adja az átadott GUI példányát, a setConnection() metódus, pedig a conn attribútumnak az átadott Connection példányát. Ez azért valósítható meg, mivel egy interfészt implementáló osztály objektuma értékül adható az interfész típusú statikus referenciának. [9] Ezután már a conn és gui attribútummal, elérhetjük a másik példány receiveXXX() metódusát, üzenetküldés céljából. Például ha a Connection példány üzenetet akar küldeni a GUI példánynak, akkor a gui.receiveConnection(”szia”) metódust meghívva, elérhetjük a GUI receiveConnnection(String data) metódusát. Tehát ennek a módszernek az alapján fog megtörténni a kapcsolattartás a MainServerConnection
és a GUI rész, a ConnectionReceive és a GUI rész, valamint a ConnectionStart és a GUI rész között. 4.3 A kliens oldali GUI rész alegységekre bontása (7. ábra) a kliens oldal felépítése A grafikus felületet mőködés szerint két nagyobb egységre bonthatjuk: egy felügyelı, és egy funkcionális részre. A felügyelı rész feladata: kapcsolattartás a kommunikációs résszel és a funkciókat megvalósító ablakokkal, valamint a funkció ablakok menedzselése. A funkcionális rész feladata a funkció ablakok (chat, fájlkeresés, fájllista, fıablak) megjelenítése, valamint kapcsolattartás a felhasználóval. A GUI résznek természetesen 18 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon egyéb feladatai is vannak, (beállítások, letöltési listakezelés, stb.) ezeket a késıbb részletezem. 4.4 A kliens és a szerver kommunikációja A kliens és a szerver közötti kommunikációt olyan
objektumokkal fogom megoldani, amelynek van egy status, és több adat mezıje. A status mezı alapján egyértelmően beazonosítható, hogy milyen jellegő adatokat tartalmaz a többi mezı. Egy másik megoldás lehetne még az XML alapú szerver-kliens kommunikáció is, de az idı rövidsége miatt az egyszerőbb, objektum alapú kommunikációs módszert fogom alkalmazni. 4.5 A szerver mőködés szerinti részekre bontása A szerver megvalósításának egy fontos követelménye, hogy egyszerre több klienst is tudjon kezelni. A kapcsolódó klienseket egy új szálra kell helyezni, és a kommunikációt ezek után egy kiszolgáló rész fogja megoldani. A kapcsolódott felhasználók adatait, egy közös láncolt listában fogom tárolni, ezáltal minden kiszolgáló rész hozzá tud majd férni. Fontos hogy ez a láncolt lista szinkronizált legyen, nehogy egyszerre több kliens aktualizálja annak tartalmát. A leírtakból következik, hogy a szerver oldalt két nagyobb
részre lehet osztani: egy kapcsolatokat fogadó, és egy kapcsolatokat kiszolgáló részre. 19 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 5. Osztálytervezés és az osztályok megvalósítása A rendszert alkotó osztályokat és kapcsolatait, majd az egyes osztályok feladatát fogom bemutatni a következıkben. 5.1 A szerver oldal csomag- és osztálydiagramjának ismertetése (8. ábra) a szerver oldal csomagdiagramja (9. ábra) a szerver oldal osztálydiagramja (1sz mellékleten és a CD-n is megtalálható) 20 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs 5.2 A szerver oldal osztályainak és metódusainak ismertetése A Message osztályt a MessagePacket csomag tartalmazza. A kliens és a szerver Message típusú objektumokkal kommunikál. Az osztály tartalmaz egy status mezıt, három String típusú adat mezıt, és egy Vector<String> típusú adat
mezıt. A status attribútum határozza meg az üzenet jellegét, vagyis azt hogy az adatmezık milyen jellegő információkat tartalmaznak. Az osztály implementálja a Serializable interfészt, ezáltal az ObjectInputStream segítségével beolvashatjuk, az ObjectOutputStream segítségével pedig kiírhatjuk az objektumot, a socketektıl elkért csatornákra. Az osztály metódusai lekérdezı metódusok. A FileShareServer osztály feladata a szerver elindítása és a kliensek fogadása a 9999-es porton. A szerver egyszerre több klienst is tud fogadni, és minden klienst egy új szálra helyez a ServerThread osztály segítségével. A connectionReceive() metódus valósítja meg a kliensek fogadását. Az alábbiakban a server csomag osztályai következnek, ezek az osztályok a szerver mőködésével kapcsolatos tevékenységeket látják el. A ServerThread osztály leszármazottja a Thread osztálynak. Feladata, hogy szálra helyezze a csatlakozó kliensek
kéréseit kiszolgáló ServerThreadWorker példányt. Konstruktorában megkapja a csatlakozó kliens socket-jét. A szál indításakor meghívódó run() metódus létrehoz egy új ServerThreadWorker példányt, majd meghívja annak messageReceive() metódusát, ezután már üzeneteket tudunk fogadni a klienstıl. A ServerThreadWorker osztály feladata a klienssel való kapcsolattartás és kommunikáció. Az osztály tartalmaz egy szinkronizált és statikus láncolt listát (usersList), amiben a kapcsolódott kliensek adatai vannak eltárolva. Azért statikus, hogy minden ServerThreadWorker példány ehhez a láncolt listához férjen hozzá, és azért szinkronizált, nehogy egyszerre több kliens módosítsa a tartalmát. Az usersList láncolt lista elemei User osztály típusúak. A naplózást a ServerLogger osztály statikus példánya, a logger végzi el 21 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A
ServerThreadWorker osztály metódusai: A messageReceive() metódus feladata a kliens által küldött Message típusú objektumok fogadása, amíg a state mezı értéke igaz. A fogadott objektum status mezıje alapján eldönti az üzenet jellegét, és meghívja a megfelelı lekezelı metódust. A login() lekezelı metódus szinkronizált és statikus is. Azért statikus, hogy minden kliens ezen a metóduson keresztül jelentkezzen be, és azért szinkronizált hogy egyszerre csak egy szál használhassa. A metódus feladata a kliensek bejelentkeztetésének elvégzése, valamint a naplóállomány aktualizálása. A logout() metódus feladata a kliensek kijelentkeztetésének elvégzése, valamint a naplóállomány aktualizálása. A chatAll() metódus feladata a kliensek közötti publikus chat megvalósítása. A chatOpen() metódus feladata a kliensek közötti privát chat kezdeményezésének, és folyamatának a megvalósítása. A chatClose() metódus feladata a kliensek
közötti privát chat befejezésének a megvalósítása. A fileSearch() metódus feladata egy fájl vagy fájltöredék megkeresése a kapcsolódott felhasználók megosztott fájljai között. A ServerLogger osztály feladata a bejelentkezés és a kijelentkezés naplózása a ServerLog.log naplóállományba A naplózást a sendLogMessages() metódus végzi Ez egy szinkronizált metódus ez által egyszerre csak egy szál írhat a fájlba. Az usersList láncolt lista elemei User osztály típusúak. Minden egyes klienshez tartozik egy ilyen típusú objektum, ami tartalmazza a kliens nick nevét, e-mail címét, megosztási leírását, IP címét és a szerver részének a port-ját, valamint a kommunikációs stream-et. Ezen kívül minden egyes objektumhoz tartozik egy hash tábla, amiben a megosztott fájlok neve és az ehhez tartozó méret és útvonal található meg. Egy User típusú objektumot egyértelmően beazonosíthatunk a nickName mezıje alapján, tehát ennek a
mezınek egyedinek kell lennie. Ebbıl következik, hogy két objektum akkor tekinthetı egyenlınek, ha azoknak a nickName mezıje megegyezik, errıl az equals() metódus gondoskodik. A lekérdezı metódusok egy-egy mezı értékét adják vissza, a search() metódus pedig a találati fájlok listáját, a fájltípusra vonatkozó szőréseket is figyelembe véve. 22 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 5.3 A kliens oldal csomag- és osztálydiagramjának ismertetése (10. ábra) a kliens oldal csomagdiagramja (2sz mellékleten és a CD-n is megtalálható) Mivel a kliens oldal szerkezete összetettebb a szerver oldalénál, ezért a csomagok kialakítására is nagyobb figyelmet kell fordítani. A csomagok kialakítása az egyes funkciócsoportok alapján fog történni. A fıbb mőködési csoportok a hálózati kommunikációt (connection csomag) és a grafikus felületet (gui csomag), valamint a kettı közti
kapcsolathoz szükséges rész (interfaces csomag) megvalósítása. A hálózati kommunikációt megvalósító csomagot is két részre oszthatjuk, a szerverrel kapcsolatot tartó részre (server csomag), és a más kliensekkel kapcsolatot tartó részre (client csomag). A grafikus felülettel kapcsolatos általános osztályok a gui csomagban vannak, ezen belül pedig a funkció ablakokkal kapcsolatos osztályok a panels csomagban találhatóak. A panels csomag osztályai által kiváltható hibakezelı kivételeket, az exception csomag tartalmazza. Az interfaces csomag, pedig a gui és a connection csomag osztályai közötti kapcsolatot megvalósító interfészeket tartalmazza. 23 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs (11. ábra) a kliens oldal osztálydiagramja, a fontosabb osztályokkal (3.sz mellékleten és a CD-n is megtalálható) 5.4 A kliens oldal osztályainak és metódusainak ismertetése Az
alábbiakban az egyes funkciócsoportok mőködését, majd ezen belül az osztályok és a fontosabb metódusok feladatát fogom ismertetni. Az összes osztály és metódus feladatának ismertetése a java dokumentációban található meg. (mellékelt CD) A FileShareClient, alapértelmezett csomagban lévı osztály feladata az alkalmazásban jelen lévı négy fı szál elindítása, és a belsı kommunikációhoz szükséges kapcsolatok beállítása. A szálak feladata, és a szálakat megvalósító osztályok: A grafikus felület megjelenítése (MWThread) Fı szerverrel való kapcsolattartás (MSCThread) Más kliensek kapcsolódásának fogadása (CRThread) Más kliensekhez való kapcsolódás kezdeményezése (CSThread) 24 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A zárójelben lévı Thread leszármazott osztályok run() metódusa önálló szálként futhat, ezért azokban létrehozok rendre:
MainWindow, MainServerConnection, ConnectionReceive, ConnectionStart osztályokból egy-egy példányt. A szálak indítása a Thread-ból leszármazott példányok, start() metódusának meghívásával történik, a FileShareClient osztály konstruktorában. A szálak létrehozása után az alkalmazáson belüli kommunikációhoz szükséges kapcsolatok beállítása történik meg. 5.41 Az interfaces csomag interfészeinek ismertetése A következıkben a kommunikációs- és gui rész kapcsolattartását fogom ismertetni, a 4.2 pontban ismertetett minta alapján. (12. ábra) a kommunikációs- és GUI rész üzenetváltása, a fontosabb metódusokkal Az MSCInterface, CRInterface, CSInterface interfészeket a MainWindow osztály implementálja. A MainServerConnection osztály a GUIMSCInterface interfészt, a ConnectionReceive osztály a GUICRInterface interfészt, a ConnectionStart osztály a GUICSInterface interfészt implementálja (12. ábra) 25 Bakai Balázs Napster
architektúrára épülı fájlcserélı és chat program, Java platformon Miután a FileShareClient példány beállította kommunikációhoz szükséges kapcsolatokat, a MainWindow, MainServerConnection, ConnectionStart, ConnectionReceive osztályok setXXX() metódusaival, megkezdıdhet a kommunikáció a másik osztály receiveXXX() metódusának meghívásával. A kommunikációhoz tehát, az interfészek által implementált receiveXXX() metódusokat használja a program. A metódusok paraméterei tartalmaznak egy status mezıt, és adat mezıket. A String típusú status mezı határozza a meg az üzenet típusát, és az adatmezık tartalmát.(Az ábrán a paraméterek az áttekinthetıség miatt nincsenek feltüntetve) 5.42 Az gui csomag osztályainak ismertetése A csomag osztályainak általános feladata a grafikus felület megjelenítése, és a felhasználóval történı kapcsolat megteremtése. A MainWindow osztálynak (MainServerConnection), a a feladata
klienseket fogadó a kapcsolattartás résszel a fıszerverrel (ConnectionReceive) és kapcsolatokat kezdeményezı résszel (ConnectionStart). Valamint a füles panelen (tabbedPane) jelen lévı funkció ablakok menedzselése (létrehozás, kapcsolattartás, eltávolítás). A letöltési listával való kapcsolattartás is itt valósul meg (downPanel) Az osztály tartalmaz egy hash táblát: public Hashtable<String,MyPanel> panels=new Hashtable<String,MyPanel>(); Ebben a táblában minden egyes String típusú ablaknévhez tartozik egy MyPanel osztály típusú referencia. A funkció ablakokat megvalósító osztályok (ChatPanel, FileListPanel, stb.) a MyPanel abstract osztályból származnak, ezért az ıs osztály típusú referenciának (MyPanel) értékül adhatóak, felfele történı típuskonverzióval. Mindegyik utód osztály megvalósítja, a MyPanel osztályban megfogalmazott abstract modify(String s1,Vector<String> v) metódust az
üzenetküldéshez. Tehát ez a hash tábla azért jó, mert ha ismerjük egy ablaknak a nevét, akkor abból könnyen lekérdezhetjük a hozzá tartózó funkció ablak referenciáját a getPanelRef(String name) metódussal, és a polimorfizmus miatt a modify() metódus meghívásakor mindig a névhez tartozó ablaknak fog meghívódni ez a metódusa. 26 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A panelAdd(String name, MyPanel panel) metódus szerepe, hogy egy MyPanel osztályból származó ablakot, adott névvel hozzáadjunk a panels hash táblához, és a tabbedPane füles panelhez. A getPanelRef(String name) metódus szerepe, hogy egy ablaknév ismeretében lekérdezzük, a hozzátartozó MyPanel típusú referenciát. A panelRemove(String name) metódus szerepe, hogy egy ablaknév ismeretében eltávolítson a panels hash táblából egy bejegyzést, és a tabbedPane füles panelról egy funkció ablakot. A
panelRemoveAll() metódus szerepe, hogy eltávolítsa a panels táblából az összes bejegyzést, és a tabbedPane panelról az összes funkció ablakot, valamint az users statikus láncolt listából a felhasználók bejegyzéseit. Ez a metódus kijelentkezéskor hívódik meg A MainWindow osztály látja el a bejelentkeztetés és a kijelentkeztetés feladatát is. A login() metódus valósítja a bejelentkeztetés feladatát. Elıször is elkéri az aktuális beállításokat egy új Settings objektumtól, majd helyes beállítások esetén felveszi a kapcsolatot a MainServerConnection és a ConnectionReceive osztályokkal. Amennyiben valamilyen hiba lépett fel, akkor azt egy elıugró ablakkal jelzi a felhasználó számára. A logout() metódus valósítja meg a kijelentkeztetés feladatát. Elıször is a fıszervertıl való kijelentkezés történik meg, majd a szerver visszaigazolása esetén, megszakítja a le- és feltöltéseket, végül leállítja a klienseket fogadó
szerver egységet. A hálózati kommunikációs egységekkel való üzenetváltáshoz felhasznált metódusok a következık: Hálózati kommunikációs egységek Üzenet típus Küldés MainServerConnection Fogadás Küldés ConnectionReceive Fogadás Küldés ConnectionStart Fogadás 27 Metódusok sendMSC( ) receiveMSC( ) sendCR( ) receiveCR( ) sendCS( ) receiveCS( ) Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A sendXXX() metódusokkal érhetı el egy kommunikációs egység receiveXXX() metódusa. A receiveXXX() metódusokkal pedig fogadni tudjuk az üzeneteket az egységektıl. Példa az üzenetváltásra: public void sendCR(String status, String data){ cr.receiveGUI(status, data); } //MainWindow osztály tartalmazza A sendCR(String status, String data) metódus meghívásakor, az meghívja a megadott paraméterekkel a setCR() metódussal beállított cr mezı receiveGUI(String status, String data)
metódusát, azaz üzenetet küld neki. public void receiveGUI(String status, String data){ /*metódus törzsét nem részletezem/ } //A ConnectionReceive tartalmazza A ConnectionReceive üzenet fogadása után a status mezı alapján eldönti az üzenet jellegét, és meghívja a megfelelı lekezelı metódust. A receiveMSC (String status, String data1, String data2, String data3, Vector <String> vector) metódus feladata, hogy fogadja a MainServerConnection osztály által küldött üzeneteket. A status mezı alapján a következı esetek fordulhatnak elı: "Hiba": Nem sikerült a kapcsolatfelvétel a szerverrel, mivel az még nincs elindítva. Egy ablak jelenik meg, hogy tájékoztasson a hibáról. "Hiba2": A szerverrel való kapcsolat megszakadt. A funkció ablakok eltávolítása a füles panelról. Egy ablak jelenik meg, hogy tájékoztasson a hibáról 28 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai
Balázs "#OKLOGIN": Sikeres bejelentkezés visszaigazolása a szervertıl, majd a fı ablak hozzáadása a füles ablakhoz. A vector tartalmazza az eddig bejelentkezett kliensek adatait. "#BADLOGIN": Sikertelen bejelentkezés a szerverhez, mert ez a nick név már foglalt. Megtörténik az eddig megkezdett kapcsolatok bontása, valamint megjelenik egy figyelmeztetı ablak, utána pedig a beállítások ablak, hogy változtassunk a nick név mezın. "#NEWLOGIN": Új kliens jelentkezett be a szerverhez. A data1 mezı tartalmazza a bejelentkezı kliens adatait. Megtörténik a fıablak modify() metódusának meghívása, és a kapcsolódott felhasználók listájának aktualizálása . "#OKLOGOUT": Sikeres kijelentkezés visszaigazolása a szervertıl. Megtörténik a panelok eltávolítása, a le és feltöltések megszakítása, valamint a fıszerverrel való kapcsolat leállítása. "#DELLOGIN": Egy kliens kijelentkezett a
szervertıl. A data1 mezı tartalmazza a kijelentkezı kliens adatait. Megtörténik a fıablak modify() metódusának meghívása, és a kapcsolódott felhasználók listájának aktualizálása. "#ALLCHAT": Publikus chat üzenet fogadása, a szerveren keresztül. A data1 tartalmazza a küldı nevét és az üzenetet. Megtörténik a fıablak modify() metódusának meghívása, és a publikus chat felület módosítása. "#OPENCHAT": Privát chat kezdeményezése. A data1 mezı a küldı nevét, a data2 mezı az üzenetet tartalmazza. Amennyiben nem létezik még ezzel a felhasználóval 29 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs chat ablak, akkor létrehoz egy új privát chat ablakot. A most már biztosan létezı ablaknak meghívja a modify() metódusát, és megjeleníti az üzenetet. "#CLOSECHAT": Amennyiben létezik a data1 mezıben levı felhasználóval privát chat ablakunk, akkor
megjelenik nekünk egy szöveg, hogy a másik kliens befejezte a beszélgetést. "#FILEFIND": Fájlkeresési találat érkezett. A data1 mezı tartalmazza, hogy melyik fájlkeresési ablaknak, a vectorban meg a találatok adatai vannak. A receiveCR(String status, String data1, String data2, String data3, String data4, Integer data5) metódus feladata, hogy fogadja a ConnectionReceive osztály által küldött üzeneteket. A status mezı alapján a következı esetek fordulhatnak elı: "#FILELISTUPSTART": Egy fájl lista feltöltés indítása "#FILELISTUPSTATE": Egy fájl lista feltöltés állapotának változása "#FILELISTUPREADY": Egy fájl lista feltöltés befejezıdött "#FILEDOWNLOADSTARTUP": Egy fájl feltöltés indítása "#FILEDOWNLOADSTATEUP": Egy fájl feltöltés állapotának változása "#FILEDOWNLOADREADYUP" Egy fájl feltöltés befejezıdött A receiveCS(String status, String data1, String
data2, String data3, String data4, Integer data5) metódus feladata, hogy fogadja a ConnectionStart osztály által küldött üzeneteket. A status mezı alapján a következı esetek fordulhatnak elı: "#FILELISTSTART": Egy fájl lista letöltés indítása "#FILELISTSTATE": Egy fájl lista letöltés állapotának változása "#FILELISTREADY": Egy fájl lista letöltés befejezıdött "#FILEDOWNLOADSTART": Egy fájl letöltés indítása "#FILEDOWNLOADSTATE": Egy fájl letöltés állapotának változása "#FILEDOWNLOADREADY" Egy fájl letöltés befejezıdött 30 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A receiveCR() és a receiveCS() metódusoknál használt adatmezık jelentése a forráskód megjegyzés részében megtalálható. Ez a két metódus minden esetben a letöltési listát megvalósító downPanel példánynak küldenek üzeneteket. A
SettingsDialog osztály feladata a beállítások ablak megjelenítése, és a beállításokkal kapcsolatos teendık elvégzése. A konstruktorban történik meg az ablak megjelenésének kialakítása, és az eseményfigyelık regisztrálása. Az ablak megjelenését két részre oszthatjuk, egy bal oldali menü faszerkezetre és egy jobb oldali beállítások panelra. Egy menüelem kiválasztásakor TreeSelectionEvent esemény keletkezik, ekkor kiértékelıdik melyik menüelem aktív, és az ahhoz tartozó panel jelenik meg a jobboldalon, errıl a valueChanged (TreeSelectionEvent) metódus gondoskodik. A loadConfiguration() metódus feladata a settings.txt állományból a konfigurációs adatok betöltése, és a mezık aktualizálása. A saveConfiguration() metódus feladata a beállítások elmentése. Az ok() metódus, a beállítások jóváhagyásakor hívódik meg, és feladata hogy ellenırizze a megadott értékek helyességét. Amennyiben valamelyik érték nem
megfelelı, akkor egy figyelmeztetı ablakot jelenít meg a hiba okával. Végül meghívja a saveConfiguration() metódust. A down() metódus feladata, hogy megjelenítsen egy fájl dialógus ablakot, és ezután kiválaszthatjuk a letöltési könyvtárat. A shared() metódus feladata, hogy kiválasszuk a megosztani kívánt fájlokat tartalmazó könyvtárakat egy fájl dialógus ablakból. A kiválasztott könyvtárakban lévı fájlok felderítését a fileExplore(String path, DefaultMutableTreeNode node) metódus végzi el. Ez egy rekurzív metódus, azaz a könyvtárszerkezet felderítésekor, önmagát hívja meg. A felderített fájlokat és azok adatait a root DefaultMutableTreeNode példányhoz fogja hozzáadni. Az aktuális fájl vagy könyvtár adatait, egy új MyNode objektum tárolja. A MyNode alkalmas az útvonal, a fájlnév, és a fájl hosszának az eltárolására. Minden egyes csomópontnak van egy setUserObject() metódusa, aminek a segítségével egy objektumot
tudunk eltárolni a csomóponthoz. Ebben az esetben ez az objektum, az újonnan létrehozott MyNode példánya lesz. Tehát a metódus feladata, hogy létrehozzon DefaultMutableTreeNode 31 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon típusú objektumokból egy faszerkezetet, ahol minden egyes csomóponthoz egy MyNode objektum tartozik a fájl, vagy könyvtár adataival. A remove() metódus segítségével, eltávolíthatjuk az eddig megosztott könyvtárakat, vagyis a root példány gyermek ágait. A MyNode osztály feladata, hogy a fájl lista faszerkezet kialakításánál, és betöltésénél van. Minden egyes ághoz egy MyNode típusú objektumot rendelünk, ezáltal eltárolhatjuk a fájl nevét, útvonalát és a hosszát a csomópontokhoz. A metódusai a mezık értékeinek a lekérdezésére szolgálnak. A Settings osztály feladata, a SettingsDialog által elmentett konfigurációs állomány beolvasása, és az
információk lekérdezhetıségének biztosítása. A readSettingsFile() metódus beolvassa az adatokat a settings.txt konfigurációs állományból. A getLoginEnabled() metódus igaz, vagy hamis értéket ad vissza annak tekintetében, hogy elég fájlt osztottunk-e meg.( minimum 20Mbyte megosztás szükséges) A többi metódus, az egyes mezık értékeit lekérdezı metódusok. A HelpDialog osztály feladata, a program használatát segítı dialógus ablak megjelenítése. A konstruktor paramétere a beolvasandó szöveg fájl neve. A textReader() metódus beolvassa a szöveges állományt, majd az megjelenik egy új ablakban. A WaitWindow osztály feladata, hogy amikor a programban valahol várni kell akkor az ablak felülete elıtt, egy GlassPane-t[1] jelenít meg, ezzel akadályozva a felhasználó beavatkozását. A konstruktorban történik az ablak megjelenítésének elıkészítése, és az események fogadásának blokkolása. A paintComponent() metódusnak a
feladata, hogy az ablak pixelein soronként végig menjen, és az aktuális oszlopbeli pixel értékeket megváltoztatja a createLine() metódus.[12] Az User osztály feladata, hogy az ilyen típusú objektumokban információkat tároljon a bejelentkezett felhasználókról, mivel a MyPanel osztályban lévı users láncolt lista elemei ennek az osztálynak a példányai. Minden egyes objektum egy felhasználónak az adatait tartalmazza. Ezek az adatok: nick név, e-mail cím, megosztási leírás, ip cím és a kliens szerver részének a port-ja. Két User típusú objektumot akkor tekinthetünk egyenlınek, ha 32 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon azoknak a nick név mezıje megegyezik, errıl az equals() metódus gondoskodik. A metódusai az egyes mezık értékét lekérdezı metódusok. A DownloadsPanel osztály feladata a letöltési listában a feltöltések és a letöltések megjelenítése, valamint
értékeinek aktualizálása. A DownloadsPanel osztály tartalmaz egy hash táblát, ahol minden egyes le ill. feltöltéshez tartozik egy egyedi azonosító, ezzel egyértelmően hivatkozhatunk egy le ill. feltöltésre private Hashtable<String, Integer> downloadFiles=new Hashtable<String, Integer>(); A letöltési számot (azonosítót) a le ill. feltöltéstıl végzı száltól kapjuk Mivel egy le vagy feltöltést egyértelmően a birtokló kliens neve, a fájl név, és a töltés irányával határozhatunk meg, ezért a String érték a következı formájú lesz: ”kliens név#fájl név#töltés iránya”. A konstruktorban történik meg a letöltési lista megjelenítésének összeállítása, valamint az esemény figyelık regisztrálása. Az addFileList() metódus feladata, hogy egy fájl lista le vagy feltöltési bejegyzést adjon hozzá a letöltési listához és a downloadFiles táblához. Az addFile() metódus feladata, hogy egy fájl le vagy
feltöltési bejegyzést adjon hozzá a letöltési listához és a downloadFiles táblához. A removeFileList() metódus feladata, egy fájl lista fel/letöltésének eltávolítása a letöltési listából. A removeFile() metódus feladata, egy fájl fel/letöltésének eltávolítása a letöltési listából. A mdifyFileList() metódus feladata, egy fájl lista fel/letöltés aktualizálása a letöltési listában. A modifyFile() metódus feladata, egy fájl fel/letöltés aktualizálása a letöltési listában. Az elıbb ismertetett metódusok egyes paramétereinek jelentése, a java dokumentációban megtalálhatók. A MyCellRenderer belsı osztály feladata, hogy a letöltési listában a letöltési állapotot egy folyamatjelzıvel jelezze. A getTableCellRendererComponent() metódus feladata, a folyamatjelzık értékeinek az aktualizálása 33 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 5.43 A panels csomag
osztályainak ismertetése (13. ábra) a funkció ablakokat megvalósító osztályok, és az User osztály Az 5.42 pontban már részleteztem a MyPanel osztály szerepét A MyPanel osztályból származó osztályoknak (13. ábra) a példányai egy-egy funkció ablakot valósítanak meg Mindegyik leszármazott osztály megvalósítja az ıs osztály absztrakt modify() metódusát, aminek a feladata, hogy módosítson egy adatot valami másra. A MyPanel osztály tartalmaz egy statikus láncolt listát (users), aminek minden eleme User típusú objektum. A lista feladata, hogy a kapcsolódott felhasználók adatait tárolja Mivel statikus, ezért minden leszármazott osztály ehhez a listához fér hozzá. A MainPanel osztály szerepe, hogy megjelenítse a fı ablak funkció ablakot a kapcsolódott felhasználók listájával, valamint itt valósul meg a publikus chatelés is. 34 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A
konstruktorban megtörténik az ablak kinézetének az összeállítása, az eseményfigyelık regisztrálása és az eddig bejelentkezett kliensek hozzáadása a kapcsolódott felhasználók listájához. Ebbıl a funkcióablakból elérhetı a publikus chat, privát chat kezdeményezés és a fájl lista lekérés funkció, ezeket rendre a chatAll(), chat() és a fileList() metódus valósítja meg. Az üzenetküldéshez a send(String status, String s1,String s2) metódust hívják meg, ami eldönti a status paraméter értéke alapján, hogy melyik hálózati kommunikációs egységnek kell továbbküldeni az üzenetet. A lehetséges üzenettípusok és a paraméterek tartalma: Funkció Fogadó hálózati alegység status s1 s2 Publikus chat MainServerConnection #CHATALL küldı neve üzenet Privát chat MainServerConnection Fájl lista lekérés ConnectionStart #CHATOPEN küldı neve fogadó neve #FILELIST Ip cím:port user neve Az egyes metódusok részletes
mőködése megtalálható a forráskód megjegyzéseiben, és a java dokumentációban. Az addVector() metódus feladata, hogy a vektorban lévı felhasználók adatait hozzáadja a kapcsolódott felhasználók listájához, valamint az users láncolt listához. A removeUser() metódus feladata, hogy eltávolítson egy bejegyzést a kapcsolódott felhasználók listájából, és az users láncolt listából. A modify() metódus feladata, hogy módosítson egy értéket, egy másik értékre. Ez lehet egy felhasználó törlése vagy hozzáadása a kapcsolódott felhasználók listájához, esetleg, egy új publikus chat üzenet hozzáadása a jobb oldali chat részhez. A ChatPanel osztály feladata, hogy megjelenítsen egy privát chat ablakot, és lebonyolítsa a beszélgetést. A konstruktorban megtörténik a privát chat ablak kinézetének az összeállítása, valamint az eseményfigyelık regisztrálása. A chat metódus által, a send() metódusnak elküldendı üzenet és
paraméterek: Funkció Fogadó hálózati egység Privát chat MainServerConnection status s1 s2 s3 #CHATOPEN Küldı neve Fogadó neve üzenet 35 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs A ChatPanel osztályból csak privát chatelést érhetjük el, ezért a send metódusnak is csak ez az egy fajta üzenet küldhetı. A chat() metódus feladata, a magán chatelés lebonyolítása A modify() metódus feladata, hogy egy új üzenetet adjunk a panelhoz. A FileSearchPanel osztály feladata, hogy megjelenítsen egy fájlkeresési ablakot, és lebonyolítson egy fájlkeresést. Valamint, hogy lehetıvé tegye a fájlok letöltését a találati listából. A konstruktorban megtörténik az ablak kinézetének az összeállítása, valamint az eseményfigyelık regisztrálása. Ebbıl a funkcióablakból elérhetı a fájlkeresés funkció, a fájl letöltés funkció, a privát chat kezdeményezés és a fájl lista
lekérés funkció, ezeket rendre a searchFile(), downloadFile(), chat(), fileList() metódus valósítja meg. Az üzenetküldéshez a send(String status, String s1,String s2, String s3, String s4) metódust hívják meg, ami eldönti a status paraméter értéke alapján, hogy melyik hálózati kommunikációs egységnek kell továbbküldeni az üzenetet. A lehetséges üzenettípusok és a paraméterek tartalma: Fájlkeresés Fájl letöltés Privát chat Fájl lista MainServerConnection ConnectionStart MainServerConection ConnectionStart status #FILESEARCH #FILEDOWNLOAD #CHATOPEN #FILELIST s1 keresendı szöveg cím : port küldı neve cím : port s2 szőrés típusa fájl útvonal fogadó neve user név s3 keresési panel neve letöltés honnantól - - s4 - user név - - Funkció Hálózati egység A modify() metódus feladata, az új találatok hozzáadása a keresési panel találatlista részéhez. A FileListPanel osztály feladata, hogy
megjelenítsen egy fájl lista ablakot, és lehetıvé tegye a fájlok letöltését. A konstruktorban megtörténik az ablak kinézetének az összeállítása, valamint az eseményfigyelık regisztrálása. Ehhez segítséget nyújt a fileListReader() metódus, ami beolvassa a fájl listát. A downloadFile() metódus, egy kiválasztott fájl letöltése esetén hívódik meg. A send() metódus itt is megkapja az üzenetet, 36 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon ami megegyezik a FileSearchPanel osztálynál ismertetett adatokkal. A modify() metódust itt nem használatos. A fentebb ismertettet négy osztályban találhatók azonos felépítéső metódusok is. Az actionPerformed() metódusokban lehetséges, a regisztrált eseményfigyelık által észlelt eseményeket elkapása. A getUser(String nick) metódus visszaad egy olyan User típusú objektumot, ami a paraméterben megadott nick névvel rendelkezik. A
getTableValue(int column) metódus visszaadja, az egérrel kijelölt sor és a column változó által beazonosított cella tartalmát. 5.44 Az exception csomag osztályainak ismertetése (14. ábra) a funkció ablakok hibakezelését lekezelı kivétel osztályok Az áttekinthetıség miatt az osztály diagrammon (11. ábra) nincsenek feltüntetve a kivétel osztályok. A hibalekezelı kivétel osztályok, a panels csomag osztályainál jelentkezı hibákat tudják lekezelni. Az egyes funkciókat megvalósító metódusok (chat(),fileList(), ), hiba esetén a PanelException osztályból származó kivételeket dobnak fel. Ezeket a 37 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon kivételeket -a metódusokat meghívó- actionPerformed() metódusban lehet elkapni, egységesen PanelException kivételként, mert azok belıle származnak. A kivételek elkapásakor mindig a hibának megfelelı elıugró ablak jelenik meg a
hibaüzenettel. Az egyes kivétel osztályok és a hiba leírása: Kivétel osztály Hiba oka Egy már letöltések között lévı állományt ExistDownloadFileException akarunk még egyszer letölteni. Saját magunktól akarunk egy állományt NickNameException letölteni NotEnabledChatException Saját magunkkal akarunk chatelni NotEnabledFileListException Saját magunktól akarunk fájl listát letölteni Egy könyvtárat, vagy egy 0 byte mérető NullByteException állományt akarunk letölteni Keresésnél, kettınél kevesebb betőt adtunk SearchLengthException meg Egy tmp kiterjesztéső állományt akarunk TmpFileException letölteni Egy olyan felhasználót akarunk elérni, aki UserNotExistException jelenleg nincs bejelentkezve. Hiba esetén, a leszármazott osztályok meghívják az ıs osztály konstruktorát átadva az üzenetet és a panel referenciáját, majd az ısosztály megjeleníti az üzenetet a panelhez tartózó dialógus ablakban. 5.45 A
connection csomag osztályainak ismertetése A connection csomagnak az osztályi (15. ábra) segítségével valósul meg a fı szerverrel való kommunikáció (MainServerConnection), a kliensek közötti kommunikáció és fájl átvitel (ConnectionReceive, ConnectionStart). 38 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs (15. ábra) a connection csomag osztályai a belsı osztályokkal A MainServerConnection osztály feladata a fıszerverrel való kapcsolattartás, Message típusú objektumokkal. A receiveGUI() metódus segítségével, tudunk üzeneteket fogadni a MainWindow osztály példányától. A beállító üzenetek fıszerverrel való kapcsolat kezdeményezésért és a kapcsolatlebontásért felelnek. Az ezekhez tartozó status az #SRVSETTING és az #MSCSTOP. A többi üzenet átküldésre kerül a szervernek Az osztály tartalmaz két belsı osztályt. Az MSCOutput osztály feladata, a fıszervernek Message
típusú objektumok átküldése. Az MSCInput osztály feladata, a szervertıl Message típusú objektumok fogadása, majd az üzenetek átküldése a MainWindow példányának a sendGUI() metódus segítségével. A ClientConnection osztályból származik a ConnectionReceive és ConnectionStart osztály. Az osztály rendelkezik egy osztályváltozóval (downNumber), ami az egyes fel és letöltéseket egy egyedi azonosítóval látja el. A ConnectionStart osztály feladata egy fájl vagy fájl lista letöltésének a megvalósítása, úgy hogy egy másik kliens szerver részéhez (ConnectionReceive) csatlakozik. Az osztály tartalmaz egy hash táblát (downs), amiben minden egyes ClientInputOutput kapcsolati szálhoz, egy egyedi érték tartozik. Hashtable<Integer,ClientInputOutput> downs=new Hashtable<Integer,ClientInputOutput>(); 39 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon Ezt az egyedi Integer
értéket, a ClientConnection osztály downNumber mezıje adja. Ez a tábla azért jó, mert ha ismerjük a letöltési azonosító számot, akkor visszakaphatjuk a fel ill. letöltéshez tartozó ClientInputOutput típusú referenciát, és annak a setDisabled() metódusának meghívásával leállíthatjuk a töltést. A receiveGUI() metódusban fogadhatjuk az üzeneteket a MainWindow példánytól. Az üzenet lehet fájl lista letöltés, fájl letöltés, egy letöltés illetve. feltöltés megszakítása vagy az összes letöltés leállítása. Az ezekhez tartózó status értékek a következık: #FILELIST, #FILEDOWNLOAD, #CSSTOP, #CSSTOPALL. A ClientInputOutput belsı osztály feladata egy fájl vagy fájl lista tényleges letöltése. Az osztály a Thread leszármazottja, ezért a run() metódusában lévı mőveletek külön szálként futnak. Ez által egyszerre több letöltést is el tudunk indítani A setDisabled() metódussal lehet egy le ill. feltöltést leállítani A
fileList() metódus egy fájl lista, a fileDownload() metódus pedig egy fájl letöltését végzi el. Fájl lista letöltésekor elıször a két fél kommunikál egymással, majd megtörténik a fájl lista átvitele. Eközben a letöltési listában lévı letöltési adatok aktualizálása folyamatosan történik. Az adatátvitel végén megtörténik a folyamok lezárása, majd a szál megszőnése Fájl letöltése is az elıbbihez hasonló, a fı eltérés az, hogy itt figyelembe vesszük, hogy eddig hány byte-ot töltöttünk le az állományból, majd a letöltés innen fog folytatódni. Ezt a RandomAccessFile példányának seek() metódusával érhetjük el. Ezzel megoldható, hogy nem kell mindig elejérıl kezdeni a letöltést. A biztonságos letöltés érdekében mindig van egy 8 byte-os visszaléptetés minkét oldalon. Azért, hogy a fájl átvitelt gyorsabbá tegyem, 60Kbyte mérető byte tömbönként kerül az állomány átküldésre. Ettıl azért lesz
gyorsabb, mert a szállítási rétegben dolgozó TCP protokoll is 64Kbyte mérető csomagokra bontja szét a byte sorozatot. Ha kisebb byte tömbönként küldeném át az adatokat, akkor egy átküldendı csomagban több helyet foglalnának le az esetleges egyéb információk, mint maga a lényeges adat. [13] A fájl és fájl lista letöltése elıtt történı kommunikációs üzenetváltás részletesen megtalálható a java dokumentációban. 40 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A ConnectionReceive osztály feladata, hogy fogadja más kliensek letöltési kérelmét. Az osztály a belsı osztályaival együtt egy több szálú szerverként mőködik, azért hogy egy klienstıl egyszerre több másik kliens is tölthessen le fájl listát és fájlokat. Itt is megtalálható a downs tábla ugyanabból a célból, mint a ConnectionStart osztálynál, annyi különbséggel hogy itt a letöltési számhoz egy
ClientThreadWorker kiszolgáló objektum referenciáját társítjuk. A receiveGUI() metódusban fogadhatjuk az üzeneteket a MainWindow példánytól. Az üzenet lehet a kliens oldali szerver indítása és leállítása, valamint egy feltöltés leállítása. Ezekhez az üzenetekhez tartózó status értékek: #CLIENTSRVSETTING, #CLIENTSRVSTOPALL, #CRSTOP. A clientConnectionReceive() metódus feladata a többszálú szerver indítása, és a kliensek egy új szálra helyezése, a ClientServerThread belsı osztály példánya segítségével. A Thread osztálytól leszármazott, ClientServerThread belsı osztály feladata, hogy minden kapcsolódó kliensnek egy új ClientThreadWorker "dolgozó" objektumot hozzon létre a run() metódusában, ezzel egy új szálra helyezve a feltöltési folyamatot. A ClientThreadWorker belsı osztály feladata, kiszolgálni a csatlakozó kliensek kérelmeit. A clientMessageReceive() metódus a status alapján megállapítja a letöltés
jellegét, majd meghívja a megfelelı lekezelı metódust. Fájl lista letöltés esetén a fileList(), fájl letöltés esetén a fileDownload() metódust. A setDisabled() metódus segítségével pedig leállíthatunk egy feltöltést. A metódusok mőködésének részletes ismertetése megtalálható a java dokumentációban. 41 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 6. Tesztelés A tesztelés során a programot, lehetıleg minden normál és szélsıséges esetre meg kell vizsgálni, és az eredményeket dokumentálni kell. A tesztelési fázis az alkalmazás teljes életciklusát végig kíséri.[11] 6.1 Installációs teszt A rendszer telepítésének tesztelése különbözı hardver-szoftver konfiguráció esetén. A tesztelés Windows operációs rendszert használó számítógépeken történt és semmilyen jellegő hibát nem tapasztaltam. 6.2 Általános funkcionális teszt A rendszer mőködésének
vizsgálata normál mőködés esetén. Helyes beállítások esetén semmilyen hibát nem tapasztaltam a kliens program mőködése közben, minden funkció megfelelıen mőködött. 6.3 Szélsıérték funkcionális teszt A rendszer mőködésének vizsgálata szélsı bemeneti/kimeneti értékek esetén. A vizsgálatot a kliensalkalmazás beállításaival kezdtem. Helytelen értékek esetén minden alkalommal egy figyelmeztetı ablak jelent meg, hibás adatok bevitele nem történhetett meg. A tesztelést, az alkalmazás funkció elemeivel folytattam, és a nem engedélyezett mőveletek esetén minden alkalommal a megfelelı hibaüzenetet kaptam. Végül a szerveralkalmazással való kommunikáció megszőnését vizsgáltam. A szerver leállására megfelelıen, hibaüzenettel reagáltak a kliensek. Az alkalmazás megfelelıen mőködött a szélsıérték teszt során. 6.4 Hálózatban történı tesztelés Az eddigi teszteléseket egy számítógépen futó, több
kliensalkalmazással végeztem. Az alkalmazás ”valódi” tesztelését, a GAMF Homokbányai kollégiumának számítógép termében végeztem el. A teszteléshez tíz Windows XP operációs rendszert használó, azonos konfigurációjú számítógép állt rendelkezésemre. A 61, 62, 63 pontban leírt szempontok alapján végeztem a tesztelést. A tesztelés során hibát nem tapasztaltam, a program a követelményeknek megfelelıen mőködött. 42 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7. Felhasználói dokumentáció A felhasználói dokumentáció, az alkalmazás használójának nyújt segítséget a program használatához. 7.1 A program rendszerkövetelményei A program futtatásához szükséges hardver és szoftver követelmények. 128 Mbyte RAM 150 Mbyte szabad HDD kapacitás VGA, vagy nagyobb felbontású monitor CD-ROM Egér Windows (tesztelve) operációs rendszer Java
futtató környezet: JRE 5.0 (a mellékelt CD-n megtalálható) 7.2 Az installálás bemutatása A következıkben a Windows operációs rendszerre történı telepítést mutatom be. 7.21 A futtatókörnyezet telepítése Elıször is a Java futtató környezet telepítését kell elvégezni a JRE 5.0 update6 futtató környezettel, ami a mellékelt CD-n megtalálható. (16. ábra) a JRE telepítése, a typical funkcióval 43 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (17. ábra) a JRE telepítés közben (18. ábra) a JRE telepítésének befejezése A telepítést a szokásos (typical) funkció kiválasztásával kezdjük (16. ábra), majd a licence elfogadásával (accept), megkezdıdik a JRE telepítése (17. ábra) A futtatókörnyezet telepítésének elvégzése után (18. ábra), a szerver program és a kliens program telepítése következik. 7.22 A szerver alkalmazás telepítése A szerver alkalmazás
telepítését a mellékelt CD-n található SetupServer.exe állomány indításával kezdhetjük el. 44 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (19. ábra) a szerver alkalmazás telepítésének elkezdése (20. ábra) a telepítéssel kapcsolatos információk megtekintése (21. ábra) a szerver program telepítési útvonalának meghatározása 45 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (22. ábra) a parancsikonok helyének meghatározása (23. ábra) a telepítés megkezdése, a kiválasztott helyre (24. ábra) a szerver alkalmazás futtatásakor megjelenı ablak A szerveralkalmazással kapcsolatos információk elolvasása után (20. ábra), meg kell adni a telepítési útvonalat (21. ábra), és a parancsikonok helyét a start menüben (22 ábra) Ezután már elindíthatjuk a fájlok másolását (23. ábra), majd futtathatjuk a szerver programot a
FileShareServer parancsikonnal (24. ábra) 46 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7.23 A kliens alkalmazás telepítése A kliens alkalmazás telepítését a mellékelt CD-n található SetupClient.exe állomány indításával kezdhetjük el. Amennyiben egy számítógépen egyszerre több kliensalkalmazást kíván futtatni tesztelési célból, akkor azokat külön könyvtárba kell telepíteni, és a parancsikonok helye sem egyezhet meg, különben felülíródnak a telepített fájlok. Valamint fontos, hogy az egy gépen futó kliensalkalmazások kliens szerver port-ja eltérı legyen. Amennyiben azonos, akkor ezt majd a program indítása után, a kapcsolati beállításoknál adhatja meg. (alapértelmezettként egy véletlen érték) (25. ábra) a kliens alkalmazás telepítésének elkezdése (26. ábra) a telepítéssel kapcsolatos információk megtekintése 47 Bakai Balázs Napster architektúrára
épülı fájlcserélı és chat program, Java platformon A telepítési könyvtár helye eltérı legyen! (27. ábra) a kliens program telepítési útvonalának meghatározása A parancsikonok helye eltérı legyen! (28. ábra) a parancsikonok helyének meghatározása (29. ábra) a telepítés megkezdése, a kiválasztott helyre 48 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs (30. ábra) a kliens alkalmazás futtatásakor megjelenı ablak A kliensalkalmazással kapcsolatos információk elolvasása után (26. ábra), meg kell adni a telepítési útvonalat (27. ábra), és a parancsikonok helyét a start menüben (28 ábra) Ezután már elindíthatjuk a fájlok másolását (29. ábra), majd futtathatjuk a kliens programot a FileShareClient parancsikonnal (30. ábra) 7.3 A kliens program használata A továbbiakban bemutatásra kerül a program használata magyarázó szövegrészekkel, és képekkel. 7.31
Beállítások A beállításokat elérhetjük a menübıl vagy az eszköztárból. Fontos hogy a beállítások mezıi nem tartalmazhatnak # -jelet, mert ezek rendszerfunkciókra vannak fenntartva, erre egyébként a program is figyelmezteti a felhasználót. 49 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (31. ábra) Személyi beállítások megadása (32. ábra) Kapcsolati beállítások megadása 50 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (33. ábra) Letöltési beállítások megadása A személyi beállításoknál (31. ábra) meg kell adni egy nick nevet, amivel a szerver azonosít minket, az e-mail címünket, és a megosztási leírást, hogy milyen jellegő fájlokat osztunk meg. A kapcsolati beállításoknál (32 ábra) meg kell adni a fı szerver elérhetıségét IP cím:port formában. A szerveralkalmazás a 9999-es port-ot használja, az IP
címhez pedig a szerveralkalmazást futtató gép IP címe kerül, ez tesztelési esetben a localhost, azaz a saját gép címe. A kliens szerver port-ja mezıhöz, egy a számítógépünkön még nem használt, egyedi port-számot kell megadnunk. Ezért ha egy számítógépre két kliensalkalmazást telepítünk, ezeknek a port számoknak eltérıeknek kell lenniük. Valamint megadhatunk egy HTTP proxy címet is, sajnos ez a funkció ebben a verzióban még nem áll rendelkezésre. Alapesetben az alkalmazás kitölti a kapcsolati beállítás mezıit, és a kliens szerver port-hoz is randomizál egy véletlen értéket. A letöltési beállításoknál (33. ábra) legalább 20 Mbyte-nyi könyvtárakat kell megosztani A keres gombra kattintva, kiválaszthatjuk a megosztani kívánt könyvtárakat. Az eltávolítás gombra kattintva pedig, eltávolíthatjuk az eddig megosztott könyvtárakat. Végül meg kell adni egy letöltési könyvtárat, ahova a letöltött fájlok fognak
kerülni. Az OK gombra kattintva elfogadhatjuk, a Mége gombra kattintva elvethetjük a beállításokat. 51 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7.32 Bejelentkezés, Kijelentkezés (34. ábra) két kliens bejelentkezése a szerverhez (35. ábra) két kliens kijelentkezése a szervertıl A bejelentkezést és a kijelentkezést elérhetjük a menübıl vagy az eszköztárból. Bejelentkezés után megjelenik a fıablak funkció ablak, és frissül mindkét kliens kapcsolódott felhasználók listája.(34 ábra) Kijelentkezés után eltőnik a fıablak funkció ablak, és megszakad a szerverrel a kapcsolat (35. ábra) A bejelentkezés és a kijelentkezés is naplózásra kerül a szerveren, és a naplófájlba. 52 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7.33 Publikus és Privát chatelés (36. ábra) publikus chatelés bemutatása négy kliens között
(37. ábra) privát chatelés kezdeményezése a fıablakból és a fájlkeresés ablakból 53 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (38. ábra) privát chatelés bemutatása négy kliens között (39. ábra) privát chatelés abbahagyása 54 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A publikus chatelést a fıablak funkció ablakból érhetjük el (36. ábra) A nyilvános chateléssel elküldött üzeneteket az összes bejelentkezett kliens megkapja. Privát chateléssel pedig egy általunk kiválasztott felhasználóval tudunk chatelni. Magán beszélgetést kezdeményezhetünk a kapcsolódott felhasználók listájából egy klienssel, vagy a keresési találat listából egy fájlbirtokló klienssel (37. ábra) A 38 ábra négy kliens páronkénti privát beszélgetését mutatja be. Amennyiben abba kívánjuk hagyni a chatelést, csak a chat funkció
ablakot kell bezárni (39. ábra) 7.34 Fájlkeresés A fájlkeresés funkciót a szerverhez történı bejelentkezés után elérhetjük az eszköztárból. (40. ábra) egy fájl keresés eredmény listája Ha rá akarunk keresni egy fájlra vagy fájl töredékre, akkor azt meg kell adni a keresés mezıben, az esetleges szőrési lehetıséggel. A szerver végignézi az összes bejelentkezett kliens megosztott fájljait, és a találatokat visszaküldi nekünk (40. ábra) Az eredmény listából lehetıségünk van letölteni egy fájlt, vagy a birtokló kliens fájl listáját, esetleg chatelhetünk is a birtokló klienssel. 55 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 7.35 Fájl lista letöltése A fájl lista, egy kliens megosztott fájljait és könyvtárait tartalmazza. Egy kliens fájl listáját lehetıségünk van letölteni a kapcsolódott felhasználók listájából, vagy egy fájlkeresés találati
listájából (41. ábra) (41. ábra) fájl lista letöltése a fı ablakból és a fájlkeresés ablakból (42. ábra) egy letöltött fájl lista 56 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon A 42. ábra szemléltet egy letöltött fájl listát A fájl lista ablak bal oldali faszerkezetében barangolhatunk a könyvtárak között, jobb oldalon pedig a kiválasztott könyvtár jelenik meg részletezve. A jobb oldali listából információkat kérhetünk le egy fájlról és tulajdonosáról, valamint fájlokat is tölthetünk le. 7.36 Fájl letöltés Fájl letöltését elindíthatunk egy keresési találat listából, vagy egy fájl listából (43. ábra) A fájl letöltés elindítása után a birtokló kliensnek, mint feltöltés a letöltı kliensnek, mint letöltés fog megjelenni a letöltési listában (44. ábra) A fájlok a letöltési beállításoknál megadott letöltési könyvtárba fognak kerülni.
Egyszerre akár több letöltést is elindíthatunk, de minden letöltésnek egyedinek kell lennie, azaz ugyanazt a fájlt nem tölthetjük le egyszerre két példányban. Amennyiben egy letöltésünk megszakadna, akkor a legközelebbi elindításakor nem elölrıl kezdi el tölteni a fájlt, hanem a megszakadási ponttól. Valamint lehetıségünk van a letöltési listában bármely fel- ill letöltés megszakításra (45. ábra) (43. ábra) fájl letöltésének indítása egy fájl listából és egy keresési találat listából 57 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon (44. ábra) a fájl letöltés megjelenik mindkét kliens letöltési listájában (45. ábra) egy fel- ill letöltés leállítása 58 Bakai Balázs Napster architektúrára épülı fájlcserélı és chat program, Java platformon 8. Összefoglalás A kitőzött célom az volt, hogy megtervezzek, majd megírjak egy fájl cserélı
alkalmazást kliens és szerver oldalon. Ehhez szükségem volt, hogy mélyebben megismerkedjek a java alapú hálózati programozással, valamint a Swing nyújtotta lehetıségekkel is. A szerver és a kliens oldallal szemben támasztott alapvetı követelmények, a fejlesztés során mind megvalósultak, tehát a kitőzött feladatot sikerült megoldanom. Úgy gondolom, hogy a rendelkezésre álló idıt teljes mértékben kihasználva, egy használható alkalmazást tudtam létrehozni. Az alkalmazás tervezése és a fejlesztése során, sok érdekes problémával találkoztam, amiket hol kevesebb, hol több idı alatt, de sikerült megoldanom. Ilyen volt például a kliensen belüli többszálú szerver mőködtetése, a kommunikációs és gui rész üzenetváltása, valamint a fájl lista mellékelt adatokkal történı létrehozása. Már az alkalmazás készítése közben is rengeteg új ötletem született, amiket sajnos a rendelkezésre álló idı hiánya miatt csak az
esetleges késıbbi verziókban tudok kamatoztatni. Ennek következtében a programot már a kezdetektıl a bıvíthetıség jegyében alakítottam ki. Ilyen ötletem volt például az XML alapú kommunikáció, fájl lista és konfigurációs állomány használata. Valamint a javanio osztályainak felhasználása a hálózati kommunikáció során. A javanio csomag osztályait azért találtam nagyon elınyösnek, mert segítségükkel akár több ezer felhasználós szervert is létre lehet hozni szálak nélkül, valamint a gyorsabb, nem blokkolható hálózati kommunikációs megoldása miatt.[3] Ezeken kívül a felhasználót segítı többletfunkciókkal is lehetne a programot bıvíteni. Ilyen például a megszakadt letöltések tárolása, ezáltal könnyebbé válhatnak az esetleges letöltéseknek az újrakezdése, vagy a fájlkeresésnél újabb szőrési lehetıségek bevezetése, a pontosabb találatok elérése érdekében. Az alkalmazás kollégiumi tesztelése során,
egy kollégistának felkeltette az érdeklıdését a program, és elkérte tılem a kollégiumon belüli fájlcserélésre. Amikor megkérdeztem, hogy miért is figyelt fel rá, csak annyit mondott, hogy ez a program egyesíti az FTP és az MSN tulajdonságait, így nem kell egyszerre két programot használni. Valamint mindig lehet látni, hogy ki van éppen feljelentkezve és a keresési lehetıséget kihasználva, nem kell hosszasan az összes helyi FTP szervert végignéznie egy fájl után kutatva. 59 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs 9. A fejlesztés során felhasznált eszközök Java futtató környezet: JDK 5.0 update 6 Fejlesztı környezet: NetBeans IDE 5.0 UML diagrammok elkészítéséhez: Java Studio Enterprise 8.0 Az alkalmazások telepítéshez felhasznált program: Setup 2GO 1.911 10. Irodalomjegyzék [1] SUN Java tutorial (Sun Microsystems) http://java.suncom/docs/books/tutorial [2]
Patrick Chan: The Java Developers Almanac 1.4 http://javaalmanac.com/egs/indexhtml [3] (2006.0511) (2006.0511) O’Reilly, Jonathan Knudsen, Patrick Niemeyer Learning Java, 3rd Edition (May 2005) [4] O’Reilly, Elliotte Rusty Harold Java Network Programming, 2nd Edition (Oct 2004) [5] Marshall Brain: Napster’s Architecture: http://computer.howstuffworkscom/file-sharing1htm [6] Tóth Benedek: A fájlcsere fejlıdése (2005. január 13) http://www.sghu/cikkek/35160/0 [7] (2006.0511) Benedek Zoltán (BME-AAIT): Szoftvertechnikák -Tervezési minták elıadás anyag 60 (2006.0511) Bakai Balázs [8] Napster architektúrára épülı fájlcserélı és chat program, Java platformon ELTE TTK Hallgatói Alapítvány, Nyékyné G. Judit: Java2 útikalauz programozóknak II. A hab [9] Angster Erzsébet Objektumorientált tervezés és programozás, Java 2. kötet [10] Dr. Raffai Mária UML2 - Modellezı nyelvi kézikönyv 4. [11] ITWARE, Szoftvertesztelési
szempontok: http://www.itwarehu/szakteruleteinkphp?pgid=szofteszt [12] (2006.0511) Jroller, Create stylish glass pane on long GUI-blocking operations http://jroller.com/page/javaproxy?entry=create stylish glass pane on (2006.0511) [13] Panem, Andrew S. Tannenbaum Számítógép – hálózatok 61 Napster architektúrára épülı fájlcserélı és chat program, Java platformon Bakai Balázs 11. Mellékletek jegyzéke 1. A szerver oldal osztálydiagramja 2. A kliens oldal csomagdiagramja 3. A kliens oldal osztálydiagramja 4. A mellékelt CD, aminek a tartalma: Diagrammok (diagramms könyvtár) Az installációs állományok (install könyvtár) Java dokumentáció (javadoc könyvtár) Forráskódok (source könyvtár) Teszt fájlok (test könyvtár) NetBeans projekt fájlok (project könyvtár) 62