Fejlesszünk elosztott, hálózatos, datagram alapú üzenetküldéssel megvalósított Java alkalmazást!
A kockadobás kliens egyszerre két szabályos dobókockával dob, amit ezerszer megismétel és a dobott számok összegét datagram típusú üzenetküldéssel folyamatosan elküldi a szervernek. A szerver localhost-on fut és egy megadott porton keresztül várja a klienstől. A szerver és a kliens egyaránt szálkezelést alkalmazó konzolos alkalmazás.
A projektben van egy swing GUI-s alkalmazás, amely JFreeChart oszlopdiagramon – folyamatosan frissítve – megjeleníti az összesített adatokat, mindez a szerver üzenetküldésével irányítva (amint beérkezik egy dobott (2-12-ig) összeg).
A kommunikációnak – a lehetőségekhez képes – biztonságosnak és – a hálózati adatforgalmat tekintve – takarékosnak kell lennie! Ennek részeként szükséges egy azonosító és egy egyszerű szabály (protokoll).
Tekintsük át mondatszerűen a szálkezelést használó kliens és szerver kommunikációhoz kötődő feladatait:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Kliens (háttérszálon):
ciklus 1-től 1000-ig egyesével
DatagramSocket létrehozása
dobás1, dobás2, dobásÖsszeg előállítása
üzenet előállítása //pl.: "12;kocka2#"
DatagramPacket létrehozása
üzenet elküldése a szervernek
visszhang/log kiírása a konzolra
DatagramSocket lezárása
várakoztatás
ciklus vége
Szerver (háttérszálon):
ciklus(végtelen)
DatagramSocket létrehozása
DatagramPacket létrehozása
üzenet fogadása a klienstől
DatagramSocket lezárása
ha(valid az üzenet) akkor
dobásÖsszeg feldolgozása
ablak grafikonjának frissítése (GUI szálon)
elágazás vége
ciklus vége
Ezek működését összefogja egy központi vezérlőosztály és ez a fejlesztőeszköz projektablakában így jelenik meg (egyetlen MVC Java projektként):
A program két felületen kommunikál. A háttérben konzolosan logol a kliens, és a háttérben futó szerver időnként frissítteti a grafikus felhasználói felületen (GUI, ablak) megjelenő grafikont:
Aki kedvet kapott: bátran készítse el a fenti terv/koncepció/specifikáció alapján az MVC Java projektet. Érdemes alaposan tesztelni: külön a szervert, külön a klienst, először indítva az egyiket, majd a másikat, leállítani az egyiket majd fordítva. Átgondoltan indokolni is hasznos, vajon mi, hogyan és miért történik.
A bejegyzéshez tartozó forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A feladat a Java EE szoftverfejlesztő tanfolyam 1-8. óra: Elosztott alkalmazások, webszolgáltatások, szálkezelés, párhuzamosság alkalmához kapcsolódik. Amikor itt járunk a tananyagban, akkor a GUI felület és a grafikon tervezése, megvalósítása már magabiztosan megy, így elegendő a hálózati kommunikációra helyezni a fókuszt.
Utolsó megosztott tankockánkkal lezárjuk a 12 részes Tankockák blog bejegyzés sorozatunkat.
A Legyen Ön is milliomos! típusú tankocka mindig 6 db, egyre nehezedő kérdést tesz fel. Egy kérdés mindig 4 válaszlehetőséget tartalmaz és ezek közül mindig egy és csak egy lehet a helyes válasz. A kérdésbank nehézségi szintek alapján csoportosított: egészen könnyű (500), nagyon könnyű (1’000), közepes nehézségű (5’000), mérsékelten nehéz (50’000), kicsit nehéz (250’000), nagyon nehéz (1’000’000). A kérdésbank 60 db kérdést tartalmaz. A játék azonnal véget ér az első hibás válasznál, és ekkor újra is kezdhető. A szakmai tartalom a korábban elkészült 11 tankockára épít és rendszerező, szintetizáló jellegű ismétlés, kötődik két tanfolyamunk tematikájához: Java SE szoftverfejlesztő tanfolyam és Java EE szoftverfejlesztő tanfolyam.
Aki mindegyik nagyon nehéz kérdésre tudja a választ és ezt a megkapott LearningApps kóddal igazolni tudja, az kap egy it-tanfolyam.hu logós csokoládét, amit bármelyik következő rendezvényünkön átvehet: Digitális Témahét, Kutatók éjszakája, Programozási Hét – CodeWeek.eu.
Letöltési folyamatot szimulálunk. A paraméterek rugalmasan beállíthatóak. Előre beállított mennyiségű adatot, párhuzamos szálakon/folyamatokon keresztül töltünk le, miközben mérjük az eltelt időt. A folyamatok állapota lehet inaktív, aktív és befejezett. Az aktív folyamatok esetében megjelenő százalék fejezi ki, hogy a folyamat hol tart a rá jutó részfeladat végrehajtásával. Összesített formában követhetjük a hiányzó és a letöltött adat mennyiségét MB-onként és százalékosan is. A folyamat szimulációjához grafikus felületű Java kliensprogram készült, egyszerű GUI komponensekkel (nyomógomb, címke, folyamatindikátor, másképpen
JButton,
JLabel,
JProgressBar swing komponensek).
Az alábbi animáció bemutatja a letöltés szimulációját:
A konkrét paraméterek: 128 MB-nyi adatot töltünk le 256 párhuzamos szálon/folyamaton keresztül, így egy-egy részfeladat 0,5 MB-nyi adat letöltését jelenti. Minden értéket/mérőszámot egész számként ábrázolunk, akár százalékhoz tartozik, akár mértékegységként MB vagy s. A változások – és egyben a frissítés is – 5 ezredmásodpercként történnek a GUI-n.
A Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb szimulációs programot tervezni, kódolni, tesztelni. A Java EE szoftverfejlesztő tanfolyamunkon, a szakmai modul 5-8. óra Szálkezelés, párhuzamosság alkalommal többféle elosztott stratégiát ismertetünk, és a 17-24. óra Socket és RMI alapú kommunikáció alkalommal pedig megvalósíthatjuk többféle protokoll szerint a hálózati kapcsolatot, letöltést/feltöltést.
Elosztott alkalmazások esetén többféleképpen is modellezhető és kialakítható a rendszer architektúrája. Elosztott lehet maga a hálózat, a számítási folyamat, az algoritmus. Elosztott objektumok kommunikálhatnak egyenrangúnak tekinthető P2P szerepkörben vagy szerver/kliens oldalon, és több dolog/elem/hardver/szoftver/komponens együttműködéseként is megvalósulhat elosztott alkalmazás. A hálózati kommunikáció folyamatát valamilyen protokoll határozza meg, amit minden komponens ismer és így meghatározott szabályrendszer szerint működik.
Hardver szinten elosztottak a többprocesszoros rendszerek. Szoftveresen elosztott például egy moduláris vállalatirányítási rendszer, illetve a mobilalkalmazások többsége. Tipikus háromrétegű webalkalmazás esetén külön szerver nyújtja az adatbázishoz kapcsolódó szolgáltatásokat, a felhasználó számítógépén található a böngészőben futó/megjelenő kliensprogram/weboldal és a kettő között a felhő rétegben lehet a funkcionálisan elosztott alkalmazáslogika (például validálás, titkosítás, tömörítés, autentikáció, autorizáció).
A vezérlést megvalósító részlet a Java forráskódból:
időzítő által meghatározottan, gyorsan és ismétlődve történnek az időzített lépések,
ha egy folyamat befejeződik, akkor kikerül a generikus listából,
ha a folyamatok generikus listája kiürült, akkor vége a szimulációnak,
ki kell választani véletlenszerűen egy folyamatot, léptetni kell véletlenszerűen, amíg be nem fejeződik,
folyamatosan nyilván kell tartani a szükséges adatokat a háttérben,
folyamatosan frissíteni kell a felhasználói felületet.
Haladóbb megközelítésben másképp is lehetne: a számítási műveletek redukálhatóak lennének, ha lenne egy – minden olyan adat karbantartásáért felelős – modellobjektum, amelynek adatai hozzá lennének rendelve a GUI komponensekhez. Aki már sejti, annak megerősítem, hogy igen, ez observer (megfigyelő) tervezési minta.
A feladat könnyen általánosítható, például:
Egy keresési feladatot oldjunk meg az állományrendszerben! Kereshetünk egy konkrét nevű fájlt, adott kiterjesztésű fájlt, joker karakterekkel paraméterezett nevű fájlt/mappát, adott méretű állományt, adott dátum előtt létrehozott fájlt… Az állományrendszer bejárása rekurzív módon történik. A gyökérben lévő mappánként külön, esetleg második szinten lévő mappánként külön indíthatók szálak, párhuzamos folyamatok. Ha egyetlen találat elegendő, akkor bármelyik szál pozitív visszajelzésére minden szál leállítható. A feladatnál nagy eséllyel nagyon különböző méretű mappákon és eltérő mélységű mappaszerkezeteken kell végighaladni, így erre érdemes lehet optimalizálni, de ez már nagyon más szintje ennek a problémának.
Active Directory szerkezetben keressünk elérhető nyomtatókat a hálózaton!
Elosztott számítási hálózatként működik/működött a SETI@home. Koncepciójának lényege, hogy egy hatalmas feladatot nem nagyon drága szuperszámítógépeken, hanem olcsó gépek ezrein, százezrein, vagy akár millióin végeztetjük el, amelyek jelentős szabad kapacitással (pl. processzoridővel, átmeneti tárhellyel) rendelkeznek és egyébként is csatlakoznak a világhálóra.
Hasonlóan elosztott működésű a torrent protokoll. A kliensek/szálak az állományokat több kisebb darabban/szeletben töltik le, természetesen párhuzamosítva. Minden csomópont megkeresi a hiányzó részhez a lehető leggyorsabb kapcsolatot, miközben saját maga is letöltésre kínálja fel a már letöltött fájldarabokat. A módszer nagyon jól beválik nagyméretű fájloknál, például videók esetében. Minél népszerűbb/keresettebb egy fájl, annál többen vesznek részt az elosztásában, ezáltal a letöltési folyamat gyorsabb, mintha mindenki egy központi szerverről töltené le ugyanazt (hiszen az informatikában minden korlátos, a sávszélesség is).
A képtömörítést végző algoritmusok is lehetnek elosztottak, ezáltal párhuzamosíthatóak. Például ha felosztjuk a képet 16*16-os méretű egymást nem átfedő részekre, akkor ezek egymástól függetlenül tömöríthetők.
A merevlemezek esetén korábban használatos defragmentáló szoftverek felhasználói felülete emlékeztet a mintafeladat ablakára.
Fontos szem előtt tartani, hogy a grafikus megjelenítés csupán a szimulációhoz tartozó – annak megértéséhez szükséges – reprezentáció, így teljesen független lehet a folyamatok valós működésétől.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
Gyakran észrevesszük, hogy a programok futtatásakor vannak bizonyos korlátok. Például egyszerre általában csak egyetlen telepítőprogram futhat egy operációs rendszeren. Vagy amíg fut egy program korábbi verziójának eltávolítása, addig nem futhat a program új verziójának telepítője. Vagy egy nagyobb erőforrás igényű program (periféria meghajtó program, képernyő videó+hang rögzítő, hardveres gyorsítást használó játékprogram) egyszerre csak egy példányban indítható el. Előfordulhat kategóriánkénti korlát is, például a különböző víruskereső programok általában „nem tűrik meg” egymást, kizárólagosságot „követelnek”.
Lássunk példát arra, hogyan kell készíteni egy példányban futó Java programot!
Néhány dolgot át kell gondolni:
Amikor először indítjuk el a programot, akkor olyan egyedi dolgot kell beállítani, ami mindvégig úgy marad, amíg a program fut. Ezt megtehetjük a memóriában, de megfelelő jogosultsággal futtatva a programot akár beleírhatunk a Windows rendszerleíró adatbázisába (Registry) is. Előbbi módszer platformfüggetlen lenne – ahogyan egy Java programhoz illik –, és az utóbbi megoldás pedig operációs rendszertől függne.
Amikor többedszer (második, harmadik… példányban) indítjuk el a programot, akkor ezt az egyedi dolgot észlelni kell és meg kell akadályozni a program másodszori, harmadszori elindítását. Hasznos, ha ezekben az esetekben kapunk hibaüzenetet, például: „This application is already running”.
Amikor a programot szabályosan állítjuk le, akkor a korábban beállított egyedi dolgot semmissé kell tenni. Ez biztosítja, hogy a program egymás után – egymással nem párhuzamosan, egymástól függetlenül – elindítható lesz.
A megoldás két részből áll. Ez a Java forráskód első része:
A program indulásakor le kell futni a fenti forráskódnak. A
static blokk a konstruktor előtt hajtódik végre (például a modell vagy a nézet rétegben). A
java.net csomag kötetlen
ServerSocket osztályú
ss nevű objektumát kell inicializálni helyben (
InetAddress.getLocalHost()) egy nem dedikált porttal (
65001). Ez elsőre mindig sikerült és az objektum „beül a memóriába” egy nem blokkoló elven működő háttérszálon. Ha (többedszerre) nem sikerül létrehozni az objektumot, akkor – kezelve a kötelezően kezelendő kivételeket – hasznos jelezni ezt logban, konzolon vagy felbukkanó párbeszédablakban és a programból ki kell lépni (másképpen: a duplikált futtatását meg kell akadályozni).
Ez a Java forráskód második része:
1
2
3
4
5
6
7
8
try{//a program csak 1 példányban futhat
if(ss!=null&&!ss.isClosed())
ss.close();
System.exit(0);
}
catch(IOExceptione){
;
}
A programból való szabályos kilépéskor le kell futni a fenti forráskódnak. Ez ellenőrzést követően lezárja az
ss objektumot és kilép a programból. Például a
main() metódusban, ha elfogynak az utasítások egy konzolos alkalmazásban, vagy GUI-s programban nyomógombra kattintás
actionPerformed() esemény, vagy (fő)ablak bezárásának kísérlete
WindowClosing() esemény.
A programot érdemes körültekintően tesztelni. Ha elrontjuk a fenti felsorolásban vázolt logikai működés végrehajtásának sorrendjét, akkor fejlesztés vagy tesztelés közben akár a számítógépet is újra kell indítanunk.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A Java EE szoftverfejlesztő tanfolyamunkon, a szakmai modul 5-8. óra Szálkezelés, párhuzamosság alkalommal megismerjük a megoldás elméleti hátterét és a 17-24. óra Socket és RMI alapú kommunikáció alkalommal többféle megvalósítást is kódolunk, tesztelünk.
A Kutatók éjszakája nemzetközi rendezvénysorozat 2005-ben indult. Magyarország 2006-ban csatlakozott. Azóta évről-évre egyre több intézmény nyitja meg hazánkban kapuit, szervez érdekes programokat, sok-sok településen, több száz helyszínen, több ezer eseményt meghirdetve sok tízezer érdeklődő/résztvevő látogatónak biztosít tartalmas estét.
Bár a kezdeményezés elsősorban a kutatói pálya népszerűsítését szolgálja, ezért leginkább a tizen- és huszonévesekre számít, az események vonzók és elég érdekesek ahhoz, hogy a kisgyerekektől a legidősebbekig mindenki megtalálja a számára izgalmas programokat. Korábban nagyobb felsőoktatási intézmények és kutatóintézetek szerepeltek döntően, de az utóbbi néhány évben egyre több kisebb intézmény, tehetséggondozással foglalkozó középiskola, cég, egyesület is csatlakozott a rendezvényhez. A Kutatók éjszakája rendezvény minden meghirdetett programja ingyenes.
Rendezvényünk plakátja
Az it-tanfolyam.hu 2021-ben is hirdetett programokat az eseményhez kötődően. Programjainkat elsődlegesen követőinknek, aktív hallgatóinknak és az alumni csoportunkban hirdettük meg, de persze nyílt rendezvényként valósult meg. Az eseményekre regisztrálni kellett a weblapon. A regisztrációs időszak két hétig tartott, szeptember 9-23-ig. Programjainkra szeptember 24-én 22:00-23:55-ig került sor.
A programjaink népszerűek voltak. A két teremben közel 50 érdeklődő látogatót fogadtunk. A többség több programon is részt vett. Néhányan kifejezetten egy-egy adott program iránt érdeklődtek. Többen is úton voltak késő délutántól szinte hajnalig, megragadva a lehetőséget, több helyszínt is meglátogattak. Kellemes hangulatban, tartalmasan töltöttük együtt az időt – végre újra személyes jelenléttel az offline világban – aminek igazán örülök.
Szeretném megköszönni az előadók színvonalas munkáját, igényes felkészülését. Köszönjük mindenkinek, aki részt vett a Kutatók éjszakája 2021 rendezvényünkön. Az előadások prezentációit tanfolyamaink hallgatói számára – a témához kapcsolódó témakörökhöz, ILIAS-ra feltöltve – tesszük elérhetővé.
22:00-22:25 – Kiss Balázs: Mitől okos egy otthon, egy pláza, egy város?
Néhány hónapja ismert, hogy okos lesz (időközben lett) az Etele pláza. Nem, nem szponzorálja 🙂 ezt az előadást. Ha a léptékeket tekintjük, akkor bizony éles a határ az otthonokban, intézményi és település szinten alkalmazott és alkalmazható okos technológiák között. Az előadó évek óta foglalkozik okos architektúrák fejlődésének történetével, koncepciójával, szoftveres integrációjával és konfigurációjával. Szívesen osztja meg gondolatait, kutatási eredményeit a témáról, beszél saját kisebb és nagyobb léptékű projektjeiről. Praktikus tanácsok is előkerülhetnek – igény szerint. Egyensúlyoz a kész komponensek testre szabási lehetőségei és a saját fejlesztés határán. Utóbbi kulcsszavai: hálózati kommunikáció megvalósítása szerver-kliens között vagy peer-to-peer többféle programozási nyelven, autentikáció, autorizáció, protokoll, tömörítés, felhő architektúrák. A program a Java tanfolyamaink orientáló moduljához kötődik.
22:30-22:55 – Kaczur Sándor: Algoritmus vesebeteg-donorok párosítására
Hogyan működik 2007 óta Nagy-Britanniában a vesebeteg-donorok párosítása? Sima csere 2 pár esetén adódik. 3 pár esetén körbeadják a vesét egymásnak – ez már jóval összetettebb probléma. A felépített óriási adatbázisban akár több száz lehetőség is adódhat. A probléma megfelelő párosítási algoritmus és számítógép nélkül, pusztán emberi erővel megoldhatatlan lenne. Az implementált algoritmus futási ideje mindössze 30 perc. A párosítást követően a következő lépés a műtétek egyidejűsége, és a donor szervek „utaztatása” minden lehetséges úton – földön, vízen, levegőben –, minden lehetséges közlekedési eszközzel. Hogyan működik mindez a gyakorlatban? Milyen korlátok, problémák adódnak? Milyen adatok alapján dönthető el a betegek „kompatibilitása”? Ezek közül mi kötődik az egészségügyhöz és mi a szállításhoz? Az előadó próbál válaszokat adni, de lehet, hogy a végén több lesz a kérdés, mint a válasz. Vajon milyen a párosítási algoritmus hatékonysága? A program a Java tanfolyamaink orientáló moduljához kötődik.
23:00-23:25 – Szegedi Kristóf: Hogyan változik a világ vezető innovációs vállalatainak 100-as toplistája?
A Thomson Reuters hírügynökség évről-évre közzéteszi a világ vezető innovációs vállalatait tartalmazó frissített 100-as toplistáját. Vajon milyen szempontrendszer alapján születik a döntés, alakul a rangsor? Az előadó áttekinti a háttérben lévő metodológia elemeit. Íme, néhány szempont: pénzügyi teljesítmény, a vezetők és befektetők közötti bizalom, innováció, környezeti hatás, emberek és társadalmi felelősség, hírnév, kockázatviselés és ellenálló képesség, jogszabályok betartása. Vajon mivel foglalkoznak a toplista elején lévő vállalatok? Kiderül, hogy az elmúlt néhány évben milyen változások történtek a toplista elején. Az előadó próbálja indokolni, vajon mik lehettek az elmozdulások okai. Lehetne előrejelzést adni és vajon érdemes? Közösen gondolkodunk mindezeken. A program a Java tanfolyamaink orientáló moduljához kötődik.
23:30-23:55 – Kaczur Sándor: Gondolkodjunk logikusan!
Az előadás során áttekintjük az intelligencia, a kreatív problémamegoldó és logikus gondolkodás összefüggéseit és izgalmas feladatokból válogatva közösen megoldunk néhány fejtörő feladatot. Néhány példa: Hány éves a kapitány?, CHOO + CHOO = TRAIN, Logikus gondolkodás teszt.
22:00-22:45 – Hollós Gábor: Objektumorientált programozás vs. funkcionális programozás Java nyelven Az előadó ismert adatszerkezeteket és ismert programozási tételeket használva összehasonlítja a hatékonyság szempontjai alapján egy-egy feladat különböző megvalósításait. Referenciaként tekint az objektumorientált megoldásokra és ehhez képest kiderül, hogy a Java 8-tól elérhető funkcionális elemek milyen változásokat jelenthetnek. Vajon kevesebb memóriát használnak? Vajon gyorsabbak? Vajon egyszerűbbek/bonyolultabbak? Vajon könnyebben megérthetőek, karbantarthatóak, dokumentálhatóak? Hogyan érdemes egyensúlyozni az általunk leprogramozott, a kollekciók hagyományos beépített műveleteit használó és a lambda kifejezések között? Kiderül. A program a Java SE szoftverfejlesztő tanfolyamunk tematikájához kötődik.
22:50-23:35 – Kiss Balázs: Denevérek a barlangban – Hálózatos Java esettanulmány tervezése és tesztelése Az előadó újragondolta egyik örökzöld esettanulmányukat, amelynek koncepciója elérhető szakmai blogunkon: Denevérek a barlangban. Kiderül, érdemes-e változtatni a programban megvalósuló elosztott, hálózati kommunikáción. Tekintettel az utolsó néhány Java verzió újdonságaira, fókuszálva különösen a 13-astól a 17-esig. Ha érdemes refaktorálni, akkor megtudjuk, hogy mit és hogyan. Ha nem érdemes, akkor indoklást kapunk arra, hogy miért nem. Az áttekintett tesztadatokat elemezve megkapjuk a választ. A program a Java EE szoftverfejlesztő tanfolyamunk tematikájához kötődik.
23:40-23:55 – Falus Anita, Németh András: Karrierváltás után – néhány hónap KKV-s tapasztalatai szoftverfejlesztőként
Mennyire könnyű ma szoftverfejlesztőként elhelyezkedni szakirányú felsőfokú végzettség nélkül? Milyen kihívásokkal találkozhatunk a felvételi folyamat során? Milyen elvárásokat támasztanak a munkaadók egy junior szakemberrel szemben? Hogyan telnek a beilleszkedés után a hétköznapok junior fejlesztőként kis létszámmal működő informatikai profilú kisvállalkozásnál? A tanfolyamainkon 2020-ban végzett előadók karrierváltó junior szakemberként személyes tapasztalataikról számolnak be. A program a Java tanfolyamaink orientáló moduljához kötődik.
Weboldalunkon cookie-kat (sütiket) használunk, melyek célja, hogy teljesebb szolgáltatást nyújtsunk látogatóink részére. További böngészésével hozzájárul ezek használatához. ElfogadAdatkezelési szabályzat
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.