A szerver kliens kommunikáció


A legtöbb esetben a kliens-szerver architektúra lehetővé teszi, hogy a feladatokat elosszuk olyan számítógépek között amelyek csak a hálózaton keresztül érintkeznek egymással ami megkönnyíti a karbantartás elvégzését. Megoldható például, hogy javítsunk, frissítsünk, áthelyezzünk vagy akár kicseréljünk egy szervert anélkül, hogy klienseire ez bármilyen hatással lenne. Ezt a változtatásoktól való függetlenséget információ elrejtésnek vagy angolul encapsulation-nek nevezik.

Az összes adat a szerver(ek)en tárolódik amelyek általában sokkal erőteljesebb biztonsági ellenőrzéssel rendelkeznek és jobban tudják szabályozni az erőforrásokhoz és adatokhoz való hozzáférést. Mivel az adattárolás centralizált, könnyebb frissíteni az adatokat, mint amennyire ez egy P2P rendszerben lehetséges lenne. Utóbbi architektúrában több száz, vagy ezer résztvevő gépen kell megoldani az adatok megváltoztatását ami időigényessége mellett a hibák előfordulásának lehetőségét is megnöveli. Először is szügségünk van a ServerSocket osztály egy példányára, amely a megadott porton fogja figyelni a beérkező kéréseket. Fontos, hogy olyan portot válasszunk, ami nincs fenntartva valami más számára. Ha sikeresen összekötöttük a szervert a portszámmal, akkor létrejön a ServerSocket objektum. Fontos, hogy ez kivételt dobhat. Az alábbi példában kivételeket kidobjuk a main() függvénynek, ahol azok ‘kezelését’ végezzük. A ServerSocket accept() metódusa a következő lényeges pont. Ez fogadja el a kapcsolatot, amelyet a kliens próbál létesíteni. Az accept addig várakozik, amíg a kliens nem indít egy kapcsolódási kérést a host felé a megadott porton. Az accept metódus egy Socket objektummal tér vissza, amelyen a szerver kommunikálni fog a klienssel. A Scanner osztály egy példányát inicializáljuk a Socket input streamjével. Magyarán a Scanner segítségével fogjuk kiolvasni az üzeneteket, amiket a Socketen keresztül a kliens küld. Amire még szükségünk lesz, az a PrintWriter egy objektuma. Ezzel fogunk tudni üzeneteket küldeni a kliensnek a Socketen keresztül. Ennek két fontos metódusa a println(), mellyel beírunk egy üzenetet, majd a flush() segítségével elküldjük. Amikor a kliens program elindul, a szervernek már futnia és várakoznia kell egy ügyfél program kapcsolódására. A kapcsolódáshoz egy Socket-et kell nyitni a megadott host és port címen. A host, az értelem szerűen a szerver host címe. A port pedig a távoli szerver portja, amelyet az figyel. A kommunikáció a Socket-en keresztül zajlik. Az olvasáshoz szükségünk van egy Scanner-, az íráshoz pedig egy PrintWriter objektumra (hasonlóan mint a szervernél). Egy másik Scanner objektummal a billentyűzetről érkező karaktereket olvassuk be. A kommunikáció végén a Socketet be kell zárni.Szerver alkalmazás elindítása. A végtelen ciklus miatt ez örökké futna, ezért ne felejtsük majd el lelőni. Kliens alkalmazás elindítása. Az exit parancs segítségével kiléphetünk. A PHP jelentése: PHP Hypertext Preprocessor. Működését tekintve ez egy szerver oldali programozási nyelv. Ez azt jelenti, hogy a PHP program futásához egy szerverre van szükség (ami a fejlesztés fázisában lehet a saját gépünk is). Ez a szerver fogja az általunk megírt PHP kódot értelmezni, és feldolgozni. Ilyen például egy Apache webserver, amit akár saját gépünkre telepítve 'localhost'-ként elérhetünk, és ezen keresztül végrehajtathatjuk a PHP kódunkat. A szerver-kliens nyelvek működése a következő: A kliens elküldi a kérését a szerver felé. Például egy űrlapon begépelt adatokat (név, cím, stb...). Ezek az adatok megérkeznek a szerverhez, amin ha fut a megfelelő feldolgozó program (akár az imént említett Apache), akkor a tárolt kód alapján a kérést feldolgozza, és visszaküldi a választ. Legyen a programunk feladata, hogy kikeresi az iménti adatok alapján a telefonszámot. Elküldtük a kérést (név, cím), a szerveren ott van a megírt program. Megérkezik a kérés a szerverre, lefut a programunk (például kikeresi egy adatbázisból a név és cím alapján a telefonszámot), majd a megfelelő formátumban visszaküldi a kliensnek az eredményt. Ez egy böngésző esetében azt jelenti, hogy az űrlapon elküldött adatok kitöltése, és a gomb megnyomása után megjelenik egy telefonszám. Egy fontos dolog ezzel kapcsolatban: A visszaküldött válaszban a saját kódunkat sosem fogjuk látni, hiszen a szerver nem a kódot küldi, hanem az általa előállított eredményt. Tehát hiába nézzük meg az eredmény oldal forráskódját, a feldolgozó PHP algoritmus sosem látszik majd, csak az, hogy mi lett annak az eredménye.

Röviden a kliens-szerver alkalmazás lényege így írható le: elküld, feldolgoz, visszaküld, megjelenít.