(J\V]HU&NOLHQVV]HUYHUUHQGV]HUHN



Hasonló dokumentumok
Ja J v a a v a há h l á óz ó a z t a i al a ka k l a maz ma á z s á o s k o Socket, URL

URL-LEL ADOTT OBJEKTUM LETÖLTÉSE (1) URL-LEL ADOTT OBJEKTUM LETÖLTÉSE

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

OOP: Java 8.Gy: Abstract osztályok, interfészek

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Az új be- és kimenet könyvtár

Hálózatkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Hálózatkezelés / 20

Segédanyag: Java alkalmazások gyakorlat

Segédanyag: Java alkalmazások gyakorlat

Java Programozás 11. Ea: MVC modell

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Java programozási nyelv 10. rész Input/output kezelés

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozási nyelvek II.: JAVA

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Abstract osztályok és interface-ek. 7-dik gyakorlat

TCP/IP kapcsolat Java nyelven

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Informatika terméktervezőknek

Programozási nyelvek Java

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Szoftvertechnológia alapjai Java előadások

Programozási nyelvek Java

7. K: JAVA alapok Konzultáció

3. Osztályok II. Programozás II

18. előadás ÁLLANDÓ KÖLTSÉGEK ÉS A KÖLTSÉGGÖRBÉK

Java gyakorlat feladatai e s megolda sai ( )

Szoftvertechnolo gia gyakorlat

BME MOGI Gépészeti informatika 8.

és az instanceof operátor

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java programozási nyelv 6. rész Java a gyakorlatban

BME MOGI Gépészeti informatika 4.

Segédanyag: Java alkalmazások gyakorlat

Concurrency in Swing

Szoftvertechnológia alapjai Java előadások

Java programozási nyelv 4. rész Osztályok II.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Számítógépes Hálózatok GY 3-4.hét

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

OOP: Java 8.Gy: Gyakorlás

Kommunikáció Androidon Mobilinternet Wifi

Az emelt szintű. informatika érettségi. programozási feladatainak. megoldása Java nyelven. NetBeans IDE 8.1 környezetben

A WEB programozása - JSP1 dr.gál Tibor őszi félév

JAVA PROGRAMOZÁS 3.ELŐADÁS

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java és web programozás

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Java és web programozás

JNDI - alapok. Java Naming and Directory Interface

Web-technológia PHP-vel

Java I. A Java programozási nyelv

Java programozási nyelv

Programozási nyelvek és módszerek Java Thread-ek

Java programozási nyelv 9. rész Kivételkezelés

A Java nyelv IV. rész - appletek, hálózati alkalmazások fejlesztése

Programozás I. Első ZH segédlet

Java és web programozás

Konkurens TCP Szerver

Programozás II. ATM példa Dr. Iványi Péter

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

INFORMATIKAI ALAPISMERETEK

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

JAVA PROGRAMOZÁS 8.ELŐADÁS

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java hálózatkezelés II. szerver-kliens kapcsolat szálkezelés JAVA PROGRAMOZÁS 10. GYAKORLAT

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Java technológiák - ANTAL Margit. komponensek. A HTTP protokoll. Webkonténerek és szervletek. Egyszerű HTTP. ANTAL Margit.

4. Gy: JAVA osztályok

Osztályok. 4. gyakorlat

Hálózati architektúrák laborgyakorlat

1. Alapok. Programozás II

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Információ és kommunikáció

Programozás C++ -ban 2007/7

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java Programozás 3. Gy: Java GUI. Swing, AWT

Objektumorientált programozás C# nyelven III.

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Java IX. telkezelés a Java-ban

Laboratóriumi gyakorlatok

Bevezető. Servlet alapgondolatok

Java IX. telkezelés a Java-ban

Programozási technológia

OCSP Stapling. Az SSL kapcsolatok sebességének növelése Apache, IIS és NginX szerverek esetén 1(10)

Számítógépes Hálózatok GY 6.hét

A Java programozási nyelv

Osztályszintű elérés, kivételkezelés, fájlkezelés

Átírás:

(J\V]HU&NOLHQVV]HUYHUUHQGV]HUHN ALAPELVEK $]HORV]WRWWDONDOPD]iVRNHJ\LNFVRSRUWMiWDNpWUpWHJ&DONDOPD]iVRNDWNpSYLVHOLNDNOLHQV V]HUYHUUHQGV]HUHN,O\HQDONDOPD]iVRNNDOPiUIHOWpWHOH]KHWHQPLQGHQNLWDOiONR]RWWD]RQEDQ QHPIHOWpWOHQ OUHDOL]iOMDKRJ\DKDV]QiOWV]RIWYHULO\HQDODSRQP&N GLN$V]HUYHUNOLHQV UHQGV]HUHNUHiOWDOiQRVViJEDQMHOOHP]KRJ\D]HJ\LNDONDOPD]iVDV]HUYHUEL]RQ\RV V]ROJiOWDWiVRNDWYpJH]DNOLHQVNpUpVHLUHpVDNOLHQVIIHODGDWDH]HQNpUpVHNPHJIRJDOPD]iVD (összeállítása) és a kérdésre adott válaszok megjelenítése. Gondoljunk például az Internetes ZHEROGDODNUDDKRODNOLHQVV]iPtWJpSH]HQIXWDE QJpV]QNHJ\HJ\IiMOWNpUOHDQQDND] egész Internetes hálózaton egedi azonosítója, az URL, vag újabb szóhasználattal URI DODSMiQ(]WDIiMOWSRQWRVDEEDQDQQDN+70/Q\HOYHQNGROWIRUUiViWDPHJIHOHO ZHEV]HUYHUW ]HPHOWHWV]iPtWJpSIRJMDHON OGHQL%iUHJ\V]HU&V] YHJHVIiMOUOYDQV]H] D]RQEDQV]iPXQNUDV]LQWHpUWKHWHWOHQ$NOLHQVJpS QN QIXWE QJpV]SURJUDPYLV]RQW puwhoph]qlwxgmddngrndwpvdnpv]twmhv]iqgpndv]hulqwphjmhohqtwld]rogdow9dqqdnro\dq HVHWHNLVDKROQLQFVNGROiVLO\HQNRUDE QJpV]DNOLHQVLQWHOOLJHQFLiMiQP~OLNKRJ\ PHJKtYMDDPHJIHOHOROYDVSURJUDPRWSpOGiXO:RUGYDJ\PiVKDVRQO GRNXPHQWXPV]HUNHV]WpVPHJMHOHQtWVHDNpUWGRNXPHQWXPRW0LQGHQPiVHVHWEHQKDH]D] LQWHOOLJHQFLDQHPNHU OWEHpStWpVUHDE QJpV]DXWRPDWLNXVDQOHW OWpVUHNDSFVROpVD]85/ alapján azonosított fájl letöltését kínálja fel a kliensgépre. Innét már a felhasználó egéni G QWpVHKRJ\PLW UWpQLNDN YHWNH]NEHQDOHW OW WWiOORPiQQ\DOPLO\HQDONDOPD]iVW szoftvert használ az állomán megjelenítésére, megtekintésére.

0.1. ábra. Webszerver ábrája A fentebb vázolt felállás eg speciális kliens-szerver rendszer, ahol a rendszer két VV]HWHYMpQHNWHYpNHQ\VpJLN UHEiUNOLHQVEODNiUKiQ\OHKHWH]HNPLQGXJ\DQD]WNpSHVHN elvégezni - szigorúan meghatározott. Felmerül a logikus kérdés, vajon mire jó még ez az elosztott alkalmazás? Nilvánvaló, hog sok egéb célra is használható eg ilen elven IHOpStWHWWHORV]WRWWUHQGV]HUQp]] QNPHJHJ\NpWDYDOViJEDQLVOpWH]DONDOPD]iVW 3RQWRVLGV]HUYHU $],QWHUQHWHW ]HPHOWHWV]iPtWJpSHNHVHWpEHQUHQGNtY OIRQWRVKRJ\DJpSHNEHOVUiMD szinkronizálva legen és persze pontos is legen. Mindenki tudja, hog a karórákhoz képest a V]iPtWJpSHNEHOVUiLQDJ\RQSRQWDWODQRNWXGQDNOHQQLWHKiWDV]LQNURQL]iOiVFVDN~J\ YDOVtWKDWPHJKDHJ\JpSHWNLQHYH] QNLGV]HUYHUQHNpVUHQGV]HUUiMiWIRO\DPDWRVDQHJ\ N OVIRUUiVDODSMiQNRUULJiOMXNDW EELJpSSHGLJHJ\HJ\NOLHQVSURJUDPRWIXWWDWDPHO\ DGRWWYDJ\EHiOOtWRWWLGQNpQWOHNpUGH]LDSRQWRVLGWDV]HUYHUWO(J\LO\HQDONDOPD]iV QDJ\RQHJ\V]HU&OHKHWKLV]HQVHPPLPiVWQHPNHOOFVLQiOQLDNOLHQVQHNPLQWLGN ] QNpQWD szerverhez fordulni - ennek azonosítója persze beállítható, de akár önállóan meg is keresheti - pvhonpuqldsrqwrvlgwdpho\dodsmiqduhqgv]huehqohixwwdwhj\wlphv]hu&sdudqfvrwd

NDSRWWPHJIHOHOIRUPiUDKR]RWWLGDGDWWDO$SpOGiEOOiWKDWKRJ\DV]HUYHUpVDNOLHQV IHODGDWDOpQ\HJHVHQHOYiOLNHJ\PiVWODV]HUYHUPHJV]HU]LpVPHJIHOHOIRUPiEDKR]]DD kívánt adatot, míg a kliens ezt megkapva és paraméterként felhasználva eg operációs UHQGV]HUV]LQW&SDUDQFVRWDONDOPD]iVWIXWWDWOH.OLHQV LGRNRQYHU]LR6WULQJ7LPH LGREHDOOLWDV7LPHYRLG 3RQWRVLGR",GR6WULQJ 6]HUYHU LGROHNHUGH]HV6WULQJ 0.2iEUD3RQWRVLGV]HUYHUiEUiMD /HYHOH]V]HUYHU Feladatát mindenki ismeri a gakorlatból, ha lefuttatom a kliens alkalmazást, akkor a EHiOOtWRWWPDLOV]HUYHUD]RQRVtWSpOGiXOPDLOV]DPDONKXDODSMiQEL]RQ\RVHOOHQU]pVHNHW HOYpJH]YHD]RQRVtWMHOV]OHNpULDPHJIHOHOOHYHOH]OiGiEODEHpUNH]HWWOHYHOHNHWpV D]RNDWEHiOOtWiVWOI JJHQNLLVW U OWHWLDV]HUYHUUO Közös elemek A fenti két példa alapján már meg is fogalmazhatjuk, hog melek a közös elemei eg kliens- V]HUYHUUHQGV]HU&HORV]WRWWDONDOPD]iVQDN í azonosítani kell a szervert a hálózaton - erre a célra szolgál az URL - és ezt az azonosítót a kliens gépen futó alkalmazásnak tudnia kell, nélküle nem képes megtalálni a szervert; í kell eg közös kódrendszer, üzenet szerkezet, amel alapján a két számítógép megérti HJ\PiVWDOHJHJ\V]HU&EEHVHWEHQH]HJ\V]DEiO\RVV]HUNH]HW&NDUDNWHUVRUR]DWOHKHW í mind a szerver, mind a kliens oldali alkalmazásban olan elemek (objektumok) legenek, amelek a kapcsolódást és az üzenetváltást el tudják látni - pl. Socket osztál a Java nelvben. í PLYHO D V]HUYHU IRO\DPDWRVDQ ILJ\HO D EHpUNH] ]HQHWHNUH OHJHJ\V]HU&EE PHJYDOVtWiVD HJ\ YpJWHOHQ FLNOXV DPHO\EONLOpSpVFVDN D V]HUYHUW OHiOOtW VSHFLiOLV utasításra van;

Azonosítás, üzenetfogadás Az URL - Uniform Resource Locator 1 - vag az újabban használt URI - Uniform Resource Identifier 2 - tökéletesen egedi mutatót biztosít a teljes Interneten eg meghatározott HUIRUUiVKR]UHVRXUFH(]D]HUIRUUiVOHKHWHJ\V]HU&PLQWSpOGiXOHJ\IiMOYDJ\HJ\PDSSD de hivatkozhat eg bonolultabb objektumra is, mint például eg adatbázis lekérés vag eg NHUHVPRWRU(QQHNHOpUpVpUHDV]iPtWJpS,3FtPHV]ROJiODPLDQpYV]HUYHUHNEHQWiUROW LQIRUPiFLNDODSMiQHJ\pUWHOP&HQPHJIHOHOWHWKHWD]HJ\HVGRPpQQHYHNQHNWRYiEEiD doménon belül - ez általában eg könvtárnak felel meg az azonosított számítógépen - az HJ\HVDOPDSSiNpVYpJ ODIiMORNHJ\HGLQHYpEONpSH]] ND]85,W A névszerver vag domain névszerver (DNS) feladata, hog az adott hálózati szegmensen összekapcsolja a nevekkel jellemzett doméneket és a számítógépet azonosító IP címet. Kérésre - ismét eg szerver! - megmondja, hog a NHUHVHWWQHY&GRPpQPHO\LNJpSHQDQQDNPHO\LNN Q\YWiUiWONLLQGXOYDWDOiOKDWPHJ2UV]iJRQNpQWKLHUDUFKLNXV felépítésben helezkednek el a névszerverek, uganakkor bárki telepíthet névszervert a saját gépére. Természetesen D],QWHUQHWHVIRUJDORPFtPIHOROGiViWYpJ]QpYV]HUYHUHNLVPHULNHJ\PiVWpVDKiO]DWRQHJ\PiVVDONRPPXQLNiOYD képesek végül a fizikai címet megadni. Eg számítógép több szervert is futtathat, bizonos határok között akárhán szervert, ameleket egmástól a port (azaz kapu) különböztet meg. A port azonosító biztosítja, hog az ]HQHWDPHJIHOHOV]HUYHUKH]MXVVRQHODV]iPtWJpSHQ$V]iPtWJpSHVV]DNQ\HOYEHQ démonnak nevezik azokat az alkalmazásokat, amelek eg-eg porton figelve fogadják a EHpUNH]NpUpVHNHW ]HQHWHNHW(]pUWD]HJ\HVV]HUYHUROGDOLDONDOPD]iVRNNDSFVRODWWDUW részét is démonnak nevezzük. Ha beletekintünk valamel alkalmazás bin vag lib N Q\YWiUiEDpVRWWGUHYpJ]GSURJUDPIiMOWWDOiOXQNDNNRUQDJ\YDOV]tQ&VpJJHO PHJWDOiOWXNDNDSFVRODWWDUWiVpUWIHOHOVHOHPHWSpOGiXOP\VTOGD0\64/DGDWEi]LVNH]HO kapcsolattartó démonja és httpd a http kéréseket fogadó webszerver (Apache) démonja. $PLQW H]W IHOWpWHOH]KHWHQ PiU WDSDV]WDODWEO WXGMD D],3 FtP WHWV]pV V]HULQW EHiOOtWKDW $ V]iPtWJpSHN PHJN O QE ]WHWKHWVpJpWDIL]LNDLV]LQWHQDKiO]DWLNiUW\iQDNDJ\iUWN iowdo JDUDQWiOW HJ\HGL D]RQRVtWV]iPD (hardware address vag rövidítve HW Address) biztosítja. Íg például a 00:0C:76:94:A9:0E hexadecimális számmal D]RQRVtWRWWKiO]DWLNiUW\DD],QWHUQHWHQD,3FtPPHOUHQGHONH]V]iPtWJpSEHQWDOiOKDWDMHJ\]HW tuiviqdnlgsrqwmiedq(eeod]iootwiveod]lvn YHWNH]LNSHUV]HKRJ\DKiO]DWLNiUW\DJ\iUWNVHKROH]HQD) OG Q QHPJ\iUWKDWQDNNpWD]RQRV+:$GGUHVVpUWpNNHOUHQGHONH]DONDWUpV]WpVSHUV]HIRO\DPDWRVDQNRPPXQLNiOQLXN NHOO PHJHJ\H]YH HJ\PiV N ] WW D IHOKDV]QiODQG D]RQRVtWV]iPRN WDUWRPiQ\DLUO%YHQ YDQ WDUWDOpN PHUW D hexadecimális elrendezés miatt 256 6 darab, azaz kereken 280000 milliárd egedi hálózati kárta gártható le. Vessük össze ezt a Föld jelenlegi lakosságával, ami ma 6 milliárd ember! $],3FtPSHUV]H FVDNDNNRUW OWLEHIHODGDWiWKDYDOEDQHJ\HGLpVNLWXGMXNV]&UQLD]HPEHULWpYHGpVWWHKiW OHKHWOHJQHDV]iPtWJpSNH]HOMHiOOtWJDVVD$FpOD]KRJ\HJ\HJ\V]ROJiOWDWLDOKiO]DWRQEHO OJpSLPHJROGiVVDO biztosítsuk az egediséget. Ezt a szerepet töltik be a DHCP alapú rendszerek, ahol a kiosztást a DHCP szerver végzi és tartja nilván, ez a szoftvereszköz tartja nilván a már kiosztott címeket és ezek fizikai azonosításához feljegzi a kérdéses gép hardvercímét is a saját adatbázisában. 1 http://archive.ncsa.uiuc.edu/sdg/software/mosaic/demo/url-primer.html 2 http://www.ietf.org/rfc/rfc2396.txt

GYAKORLATI MEGVALÓSÍTÁS A Java nelvet és annak fejlesztési elveit, alkalmazási területeit ismerve biztosak lehetünk DEEDQKRJ\NOLHQVV]HUYHUDONDOPD]iVRNDWPiUVRNDQNpV]tWHWWHNpVH]pUWIHOWpWHOH]KHWHQ vannak már kész eszközök eg ilen típusú alkalmazás megvalósításához. Vizsgáljuk meg WHKiWHOV] ULVKRJ\D-DYDQ\HOYPLO\HQHV]N ] NHWNtQiOIHOV]iPXQNUDPLO\HQNpV] osztálokból tudjuk összeépíteni a kívánt rendszert. A Java dokumentáció tartalmazza az alábbi ábrát is, és ennek alapján már elindíthatjuk a keresésünket. 0.3. ábra. Java 2 platform (J2SE v. 1.4) csomagszerkezete A Java SDK úgnevezett Core API csomagjai között találjuk a Networkig csomagot, azon belül a java.net csomagot és ennek osztálai biztosítják számunkra az összes eszközt alkalmazásunk felépítésére. Vizsgáljuk meg a számunkra legfontosabb három osztál IHOpStWpVpWP&N GpVpW SERVERSOCKET OSZTÁLY Csomag: java.net Deklaráció: public class ServerSocket. ]YHWOHQVjava.lang.Object

A ServerSocket osztál példána szerver oldali kapcsolóelemet, kapcsolódási pontot 3 (socket) KR]OpWUH$NDSFVROGiVLSRQWDKiO]DWRQiWpUNH]NpUpVHNUHYiUpVDNpUpVDODSMiQEL]RQ\RV WHYpNHQ\VpJHNHWYpJH]PDMGOHKHWVpJHWEL]WRVtWDUUDKRJ\DYiODV]YLVV]DNHU OM QDNpUGpVW IHOWHYK ])RQWRVPHJMHJ\H]QLKRJ\DV]HUYHUROGDOLNDSFVROGiVLSRQWPXQNiMiW ténlegesen a SocketImpl osztál eg példána végzi. Eg alkalmazásban megváltoztathatjuk a kapcsolóelemet létrehozó programrészletet (factor) - amel a példánosítást végzi - ol PGRQKRJ\DKHO\LW&]IDOQDNPHJIHOHONRQILJXUiFLM~NDSFVROHOHPHNHWKR]]RQOpWUH 0H]N private boolean created private boolean bound private boolean closed private SocketImpl impl $]HOVKiURPPH]DNDSFVROHOHPiOODSRWiWWiUROMDD]D]OpWUHKR]iVWSRUWKR]N WGpVW pvoh]iuivwptjdqhj\hglnph]dwpq\ohjhvwhypnhq\vpjhwypj]socketimpl típusú objektum referenciája. Konstruktorok ServerSocket() ServerSocket(int port) ServerSocket(int port, int backlog) ServerSocket(int port, int backlog, InetAddress bindaddr) $QpJ\NRQVWUXNWRUDQpJ\ N O QE ]OpWUHKR]KDWREMHNWXPpUWIHOHO$]HOVHVHWEHQ HJ\N WGpVpVPLQGHQIpOHHJ\pEPHJN WpVQpON OLREMHNWXPRWKR]XQNOpWUHDPiVRGLN esetben már megadjuk, hog melik port-hoz kapcsolódik az objektum, a backlog változó beállítja a felsorakoztatható üzenetek, kérések számát (az objektum addig fogad új kérést, míg ezt a beállított számot el nem éri, ez alapértelmezetten 50 kérés), és a bindaddryiowr]ydoqhypqhnpvwtsxviqdnphjihohohqd]wd],3ftphwdgkdwmxnphj DPHO\FtPHQV]iPtWJpSHQDV]HUYHUNDSFVROHOHPHOpUKHW7HUPpV]HWHVHQD],3FtP megadható a doménnévvel is, a címfeloldást a területileg illetékes DNS szerver végzi majd. Fontosabb metódusok $KRJ\HUUOPiUNRUiEEDQV]YROWDWpQ\OHJHVPXQNiWDSocketImpl osztál példána végzi. ËJ\DPHWGXVRNHJ\UpV]HHQQHNOpWUHKR]iViWDN O QE ]KHO\]HWHNEHQV] NVpJHV módosításokat hivatott intézni. A ServerSocket objektum használata során az esetek 3 A socket szó valójában - nagon jó képi megközelítéssel - eg foglalatot, aljzatot jelent, mint amelet az elektromos kapcsolatok létrehozásánál használunk. Minteg "összedugjuk" a klienst és a szervert az aljzaton keresztül.

többségében az accept() metódus meghívásával eg Socket objektumot hozunk létre és a további tevékenséget már ez végzi. void createimpl() throws SocketException Hibakezeléssel kiegészítve, a setimpl() metóduson keresztül létrehozza a Socket objektumot. private void setimpl() Amenniben az alkalmazás speciális kapcsolóelemek létrehozását igénli, a factor objektum segítségével ezen a metóduson keresztül beállíthatjuk a kapcsolóelem tulajdonságait. SocketImpl getimpl() throws SocketException A SocketImpl osztál kódját hozzákapcsolja ehhez a kapcsolóelemhez, amenniben ez még nem létezik, létre is hozza a SocketImpl objektumot. public Socket accept() throws IOException $PHWGXVD]DGRWWNDSFVROHOHPKH]W UWpQNDSFVROGiVWILJ\HOLpVDPHQQ\LEHQLO\HQ történik, azt elfogadja. A kapcsolódásig a metódus blokkol. Létrehoz eg új általános kapcsolóelem objektumot (Socket socket) és amenniben a rendszerben van biztonsági menedzser (SecuritManager), annak checkaccept() metódusát hívja meg a frissiben létrehozott objektum socket.getinetaddress().gethostaddress() kódjával és a socket.getport() NGMiYDO PLQW SDUDPpWHUHNNHO KRJ\ HOOHQUL]]H YDMRQ D P&YHOHW HQJHGpO\H]HWWH $PHQQ\LEHQ QHP EL]WRQViJL NLYpWHO NHOHWNH]LN pv D P&YHOHWHWQHPKDMWMDYpJUH 0iV NLYpWHOHN LV NHOHWNH]KHWQHN D] HOOHQU]pV VRUiQ DPHO\HN IHOVRUROiViWO LWW PRVW eltekintünk. 4 public InetAddress getinetaddress() Visszaadja az aktuális szerver kapcsolóelem lokális címét, azaz azt a címet, amelhez a NDSFVROHOHP N WGLN $PHQQ\LEHQ D NDSFVROHOHP QHP N WGLN VHKRYD VHP D visszaadott érték null. public String tostring() Visszaadja a kapcsolóelem létrehozásához megadott címet és portszámot string formájában. public void close() throws IOException Lezárja a kapcsolatot. Amenniben a kapcsolathoz kommunikációs csatorna is hozzá van rendelve, azt is lezárja. 4$-DYDGRNXPHQWiFLMDYDGRFVYDJ\HJ\V]HU&HQGRFVOHW OWKHWD http://java.sun.com/j2se/1.4.2/download.html#docszhekho\uo/hw OWpVpVNLFVRPDJROiVXWiQDNpUGpVHV információ (feltéve, hog a teljes anagot eg javadocs mappába tömörítettük ki közvetlenül a C meghajtón) a C:\javadocs\api\java\net\ServerSocket.html fájlban lesznek megtalálhatók. A java.net csomag a teljes GRNXPHQWiFLQHWZRUNLQJEORNNMiEDQOHOKHWIHO

SOCKET OSZTÁLY Csomag: java.net Deklaráció: public class Socket. ]YHWOHQVjava.lang.Object A SocketRV]WiO\NOLHQVNDSFVROHOHPHNHWKR]OpWUHH]HNHWHJ\V]HU&HQFVDN kapcsolóelemeknek is hívhatjuk. Mind a kimenet, mind a bemenet szabálozására képes, azaz HJ\V]HU&NpWLUiQ\~IRUJDOPDWYDOVtWPHJ$NDSFVROHOHPOpQ\HJpEHQHJ\HJ\ kommunikációs végpont két számítógép között, de amenniben a kliens-szerver rendszer XJ\DQD]RQV]iPtWJpSHQNHU OPHJYDOVtWiVUDDP&N GpV NWRYiEEUDLVKiO]DWRVDODSRQ meg, mintha a két gép közötti link kábel nulla hosszúságú lenne. A kapcsolóelem munkáját valójában a SocketImpl osztál példána látja el, a ServerSocket esetében már megismert módon. Ezért itt is igaz, hog eg alkalmazásban megváltoztathatjuk a kapcsolóelemet létrehozó programrészletet (factor) - amel a példánosítást végzi - ol módon, hog a KHO\LW&]IDOQDNPHJIHOHONRQILJXUiFLM~NDSFVROHOHPHNHWKR]]RQOpWUH 0H]N private boolean created private boolean bound private boolean connected private boolean closed private boolean shutin private boolean shutout SocketImpl impl $]HOVKDWPH]DNDSFVROHOHPiOODSRWiWWiUROMDD]D]OpWUHKR]iVWSRUWKR]N WGpVWpV NDSFVRODWIHQQiOOiViW OH]iUiVW PtJ D] XWROV PH] D WpQ\OHJHV WHYpNHQ\VpJHW YpJ] SocketImpl típusú objektum referenciája. A shutin és shutout logikai változók az input és az output állapotának jelzésére szolgálnak, amenniben értékük true ezek már OH]iUWQDNWHNLQWKHWN Konstruktorok A konstruktorok nagmértékben hasonlítanak a ServerSocket osztálnál már megismertekre, KLV]HQDIXQNFLNLVMHOHQWVPpUWpNEHQKDVRQON,WWPRVWFVDNDIRQWRVDEEDNDWVRUROMXNIHO public Socket() $UHQGV]HUDODSpUWHOPH]pVpQHNPHJIHOHOSocketImpl típus alapján kapcsolódás nélküli kapcsolóelemet hoz létre. public Socket(String host, int port) throws UnknownHostException, IOException Létrehoz eg folam (stream) kapcsolóelemet és a megadott számmal azonosított porthoz kapcsolja a megnevezett gazdagépen. Amenniben az alkalmazás

meghatározott eg server socket factor-t, akkor annak createsocketimpl() metódusát hívja meg az aktuális kapcsolóelem példán létrehozásához, egébként HJ\V]HU&NDSFVROHOHPHWKR]OpWUH$EL]WRQViJLHOHPHNHWXJ\DQ~J\YHV]LILJ\HOHPEH mint a ServerSocket osztál esetében. public Socket(InetAddress address, int port) throws IOException Létrehoz eg folam (stream) kapcsolóelemet és a megadott számmal azonosított porthoz kapcsolja a megadott IP címen. public Socket(String host, int port, InetAddress localaddr, int localport) throws IOException Létrehoz eg kapcsolóelemet és a megadott távoli gazdagéphez kapcsolja a megadott távoli porton keresztül. A kapcsolóelem uganakkor kapcsolatot hoz létre a megadott heli címhez és porthoz. public Socket(String host, int port, boolean stream) throws IOException Létrehoz eg folam (stream) kapcsolóelemet és a megadott számmal azonosított porthoz rendeli a megnevezett gazdagépen. Amenniben a stream paraméter true értéket kap, a létrehozott kapcsolóelem folam típusú, ha azonban ennek értéke false, eg datagram típusú kapcsolóelem jön létre. Felmerülhet a kérdés, mi a különbség a két kommunikációs mód között, melik a jobb. Mint anni más esetben, természetesen itt sincs abszolút igazság, attól függ, hog mit akarunk csinálni. Míg a datagram egszeri adatcsomag, DIRO\DPVWUHDPNDSFVRODWKR]IHQQNHOOWDUWDQLDNDSFVRODWRW KX]DPRVDEE LGHLJ(EEO N YHWNH]LN KRJ\ U YLG ]HQHWHNHVHWpQDIRO\DPWtSXV~NDSFVRODWIHOpStWpVHpVOHERQWiVDVRNNDOW EELGWYHKHWHOPLQWD] ]HQHWWRYiEEtWiV PDJDtJ\QHPJD]GDViJRV$PiVLNV]iPtWiVEDYHHQGWpQ\YLV]RQWDIRO\DPWtSXV~NDSFVRODWPHJEt]KDWViJD Metódusok - kapcsolatot létrehozó metódusok A Socket létrehozásának menete lénegében megegezik a ServerSocketnél leírtakkal, íg V]iPRVEHiOOtWpVOHNpUGH]PHWGXVLVPHJIHOHOD]RWWPHJLVPHUWQHN$]DOiEELDNEDQFVDN QpKiQ\IRQWRVDEEHOWpUPHWGXVWLVPHUWHW QN public void connect(socketaddress endpoint, int timeout) $ OpWUHM WW NDSFVROHOHPHW D V]HUYHUKH] NDSFVROMD D PHJDGRWW LGN V] E puwpnnho $PHQQ\LEHQLWW]pUpUWpNHWDGXQNPHJH]PHJKDWiUR]DWODQLGN V] E WMHOHQWD]D]D kapcsolat blokkol, míg létre nem jön vag hiba keletkezik. public void bind(socketaddress bindpoint) A kapcsolóelemet heli címhez köti. Metódusok - információt szolgáltató és beállító metódusok Ezek segítségével kapunk információt a heli és a kapcsolódáshoz felhasznált távoli IP FtPUODSRUWD]RQRVtWV]iPUOpVDEHiOOtWPHWGXVRNiOOtWMiNDSocketREMHNWXPPH]LWLV 0&N GpV NUpV]OHWHLWD6RFNHWMDYDRV]WiO\IRUUiVNGMiEDQWDQXOPiQ\R]KDWMXNH]DOHW OW WW JDK kibontása után, annak könvtárában, az src.zip állománban található meg. Az

RV]WiO\KLHUDUFKLiQDNPHJIHOHOHQH]HQEHO OLVDMDYDPDSSDQHWN Q\YWiUiEDQWDOiOMXND csomag forrásfájljait. public InputStream getinputstream() public OutputStream getoutputstream() (]DNpWPHWGXVDGHNODUiFLMXNQDNPHJIHOHOHQDV]iPXQNUDOHJIRQWRVDEEDGDWRNDWD NLpVEHPHQNDUDNWHUVRUR]DWRWDGMDYLVV]D,WWWDOiOMXNPHJYDOMiEDQD] ]HQHWHWpVD] arra küldött választ is. 0HWGXVRNDSXIIHUWiOOtWpVOHNpUGH]PHWGXVRN public snchronized void setsendbuffersize(int size) public snchronized int getsendbuffersize() public snchronized void setreceivebuffersize(int size) public snchronized int getreceivebuffersize() Mindkét beállító metódus esetében a SocketOptions interfész konstansait állítjuk be a SocketImpl osztálon keresztül. A fogadó puffer esetében a SO_RCVBUF D NLPHQ puffer esetében a SO_SNDBUF értékét állítjuk. )HODGDW +R]]XQN OpWUH HJ\ QDJ\RQ HJ\V]HU& 6HUYHU6RFNHW SpOGiQ\W pv tudvvxn NL D] DNWXiOLV SDUDPpWHUHLW(KKH]D]RQEDQPHJNHOOtUQLD]WPHJV]OtWNOLHQVROGDOL6RFNHWSpOGiQ\NGMiWLV mert a szerver csak a kapcsolat létrejöttekor, annak elfogadásakor hozza létre a kommunikációt biztosító saját Socket példánát. Fordítsuk le mindkét forráskódot és a két programot egmástól I JJHWOHQ ON O QYLUWXiOLVJpSSHOIXWWDVVXN(OVQHNDV]HUYHUWNHOOHOLQGtWDQLXWiQDDNOLHQVW )RUGtWiV$IRUUiVNGRWSDUDQFVVRURVIHO OHWUOLVIRUGtWKDWMXNHKKH]V] NVpJHVKRJ\D FRPSLOHUMDYDFH[HHOpUKHWOHJ\HQD'26SDWKEOD]D]DSDWKYiOWR]EDQOHJ\HQEHQQHD]D könvtár, amelben a program megtalálható. Jelen esetben ez a c:\j2sdk1.4.2\bin könvtár. Ebben az esetben bárhonnan indíthatjuk a javac.exe-t, de természetesen teljes elérési utat kell megadni a forrásfájlhoz. A lefordított class állomán megtalálható lesz uganabban a könvtárban. A futtatás parancs kiadása már eg kicsit bonolultabb. A java.exe uganis alapértelmezetten csak eg paramétert (a futtatandó osztál nevét) és nem állománt vár, de persze az osztált WDUWDOPD]IiMON Q\YWiUiWLVPHJNHOODGQXQN(EEOSHUV]HD]LVN YHWNH]LNKRJ\HJ\ N Q\YWiUEDQQHPOHKHWNpWD]RQRVQHY&RV]WiO\PHUWDMDYDH[HQHPWXGN O QEVpJHWWHQQL közöttük. ËJ\DSDUDQFVKHO\HVPHJDGiVDDN YHWNH] java -cp könvtárnév osztálnév Ez ebben az esetben a java -cp c:\javaprog\medzi AlapServer parancs lesz. Forráskód AlapServer.java import java.io.*; import java.net.*; class AlapServer {

public static void main(string[] args) { Sstem.out.println("AlapServer elindult"); tr { // a szerver objektumok létrehozása, kapcsolat elfogadás ServerSocket ss = new ServerSocket(8008); Socket in = ss.accept(); // kapcsolat adatai Sstem.out.println("IP cim: " + in.getinetaddress()); Sstem.out.println("port szama: " + in.getlocalport()); Sstem.out.println("input stream: " + in.getinputstream()); Sstem.out.println("output stream: " + in.getoutputstream()); Sstem.out.println("send buffer: " + in.getsendbuffersize()); Sstem.out.println("receive buffer: " + in.getreceivebuffersize()); catch (Exception e) { Sstem.out.println("Hiba: " + e); Sstem.out.println("AlapServer leallt"); Forráskód AlapKliens.java import java.io.*; import java.net.*; class AlapKliens { public static void main(string[] args) { tr { String host; // paraméterként is lehessen gazdagépet megnevezni if (args.length > 0 && args[0]!= null) { host = args[0]; else { host = "localhost"; // a kapcsolóelem létrehozása Socket t = new Socket(host, 8008); catch (Exception e) { Sstem.out.println("Hiba: " + e); A futás eredméne SOCKETIMPL OSZTÁLY Csomag: java.net

Deklaráció: public abstract class SocketImpl implements SocketOptions. ]YHWOHQVjava.lang.Object Fontosabb implementált interfészek: SocketOptions Ez az interfész szolgáltatja a Socket adatokat, mint például timeout és más egebek. A SocketImpl absztrakt osztál a közös szuperosztála mindazon osztáloknak, amelek ténlegesen létrehozzák a kapcsolóelemeket. Ez használhatjuk mind a kliens, mind a szerver oldali kapcsolóelemek létrehozására. Eg "sima" kapcsolóelem ezeket a metódusokat pontosan úg valósítja meg, ahog azok OHtUiVUDNHU OWHNpVQHPNtVpUOLPHJKRJ\W&]IDORQYDJ\SUR[LV]HUYHUHQSUEiOMRQPHJ áthatolni. 0H]N protected FileDescriptor fd protected InetAddress address protected int port protected int localport /iwkdw KRJ\ D PH]N D]RNDW D] DGDWRNDW WDUWDOPD]]iN DPHO\HNUH D NDSFVROHOHPHNQHNV] NVpJ NYDQDP&N GpV NN ]EHQD]D]D],3 FtPDKHO\LpVD távoli gép port azonosítója. Ehhez hozzájön még a FileDescriptor osztál példána, amel azonosító a pufferbe írt, állománként kezelt karaktersorozatok mutatójaként szolgál. Konstruktorok: Konstruktora nincs, hiszen absztrakt osztál. Metódusok void setsocket(socket soc) void setserversocket(serversocket soc) Ez a két metódus állítja be, hog a SocketImpl milen típusú legen, szerver, vag NOLHQVROGDOLNDSFVROHOHPNpQWP&N GM Q Természetesen a SocketImpl tartalmazza mindazon általános metódusokat, ameleket akár a ServerSocket, akár a SocketREMHNWXPRNP&N GpVHNRUPHJKtYXQNKLV]HQDWpQ\OHJHV munkát ez az osztál végzi. Ezeket itt most nem is soroljuk fel az ismétlés elkerülésére. Javasoljuk azonban a SocketImpl.java fájl tanulmánozását, mert a megjegzésekkel, PDJ\DUi]DWRNNDOEVpJHVHQHOOiWRWWIRUUiVNGEOPLQGHQPHJpUWKHW

KLIENS-SZERVER ALKALMAZÁS Kis keresgélés után eg Java nelvet oktató kolléga 5 weboldalairól töltöttük le az alábbi két kis példaprogramot. Ez a program -legalább is ötletszinten - uganakkor megtalálható a Core Java könvben is 6. Eg-két helen átírva a logikáját és persze az összes üzenetét, ezen WDQXOPiQ\R]KDWMXND]DONDOPD]iVP&N GpVpW)LJ\HOM QNDUUDKRJ\HORV]WRWWDONDOPD]iV esetén a kliens és a szerver program önálló, azaz biztosítani kell a külön-külön futtatás OHKHWVpJpWN O QIiMON O QPDLQPHWGXVD]D]N O QYLUWXiOLVJpSGHDNpWSURJUDP asszimetrikusan összetartozik. Az asszimetria itt azt jelenti, hog a szerver elindítható a kliens QpON OH]DWHUPpV]HWHVIXWiVDGHDNOLHQVSURJUDPP&N GpVHV]HUYHUQpON OpUWHOPHWOHQ$ PHJIHOHOHQPHJtUWNOLHQVHOV] UDV]HUYHUWSUEiOMDHOpUQLDPHQQ\LEHQH]QHPVLNHU O hibajelzést fog adni. $NpWHUHGHWLIRUUiVIiMOWPHJMHJ\]pVHNNHOOiWWXNHOKRJ\HJ\V]HU&HQpUWHOPH]KHWOHJ\HQ Szerverprogram - EchoServer.java //a szükséges csomagok import java.io.*; import java.net.*; class EchoServer { public static void main(string[] args) { Sstem.out.println("EchoServer elindult"); tr { //szerver kapcsolóelem objektum, amel a megadott porton figel ServerSocket s = new ServerSocket(8008); /* elfogadja a kapcsolatot a kliens kérésére és általános kapcsolóelemet hoz létre */ Socket incoming = s.accept(); Sstem.out.println("létrejött a kapcsolat a " + incoming.getinetaddress() +" IP számú gazdagéphez a " + incoming.getlocalport()+ " portszámon."); //az íráshoz-olvasáshoz szükséges objektumok BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream())); //a kiíró objektumot fel is használjuk eg barátságos üdvözlésre out.println("hahó! Itt a Java EchoServer. 5 Xiaoping Jia, School of Computer Science, Telecommunications, and Information Sstems, De Paul Universit, Chicago, USA 6 Ca S. Horstmann, Gar Cornell Core Java (5. kiadás) 2. kötet 203. oldal

Kilépéshez BYE utasítás kell."); out.flush(); // végtelen ciklus, amel a szervert futtatja leállításig for (;;) { 6WULQJVWU LQUHDG/LQHEHROYDVVXNDEHM YIRO\DPRW if (str == null) { break; // ha nem jött semmi, nem csinálunk semmit else { /*az out objektum a kliensnek küldi vissza a paramétert, ez a kliens ablakában jelenik meg */ out.println("ezt küldte a kliens: " + str); out.flush(); //ürítjük a puffert, ha nem tesszük, nincs kiíratás! Sstem.out.println("Ezt kapta a szerver: " + str); if (str.trim().equals("bye")) //leállító utasítás break; incoming.close(); // lezárjuk a socket objektumot catch (Exception e) { KDYDODPLQHPVLNHU OWPHJIHOHOKLED ]HQHWHWN OG QN Sstem.out.println("Hiba: " + e); // Értesítést küldünk Sstem.out.println("EchoServer leállt."); Kliensprogram EchoClient.java import java.io.*; import java.net.*; class EchoClient { public static void main(string[] args) { tr { String host; /* a kliensnek paraméterként átadhatom a gazdagép nevét, alapértelmezetten ez a localhost */ if (args.length > 0 && args[0]!= null) { host = args[0]; else { host = "localhost"; // általános célú kapcsolóelem objektum, gazdanévvel és portszámmal Socket s = new Socket(host, 8008); // olvasó-író objektumok BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream())); // legen tíz üzenet for (int i = 1; i <= 10; i++) { Sstem.out.println("Átküldve: " + i + ". sor"); // a ténlegesen kiküldött sor, ezt látja a szerver out.println(i + ". sor ");

// puffer ürítés out.flush(); /* lezárjuk eg üzenettel a szervert, a szerver kódjába beleégetve a lezárást biztosító string */ out.println("bye"); out.flush(); /* ez a végtelen ciklus figeli a socket objektumra punh] ]HQHWHNHWPRVWDV]HUYHUUOpUNH]NHW for (;;) { String str = in.readline(); if (str == null) { break; else { // kiírjuk, ami beérkezett Sstem.out.println(str); catch (Exception e) { /* ha például nem meg a szerver, nincs kapcsolódás és itt kapunk hibaüzenetet, mint például: Hiba: java.net.connectexception: Connection refused: connect */ Sstem.out.println("Hiba: " + e); )HODGDW )RUGtWVXN OH D NpW IRUUiVIiMOW pv IXWWDVVXN (OV] U WHUPpV]HWHVHQ D V]HUYHUSURJUDPRW LQGtWMXN XWiQD D NOLHQVW 9L]VJiOMXN PHJ KRJ\ D NLPHQHWHQ PHJMHOHQ ]HQHWHN KRQQDQ származnak, melik jön közvetlenül a programból eg-eg Sstem.out.println() utasításra, és melek jönnek az in és out kommunikációs objektumokból. A futás eredméne Feladat: Alakítsuk át a kliens-szerver alkalmazást, hog a kliens a konzolról beírt üzeneteket küldje HODV]HUYHUQHND]YLV]RQWDGMDYLVV]DH]HNHWPGRVtWYDSpOGiXOQDJ\EHW&VIRUPiEDQ$OHiOOtWiV WRYiEEUDLVPHJHJ\H]pVV]HULQWD%<( ]HQHWOHJ\HQGHEiUPLO\HQNLVpVQDJ\EHW&VIRUPiEDQ megadható legen. Ne csak a szerver álljon le a be üzenetre, hanem a kliens program futása is IHMH]GM QEH Forráskód AllCapServer.java import java.io.*; import java.net.*; class AllCapServer { public static void main(string[] args) { Sstem.out.println("AllCapServer elindult"); tr { // a szerver objektumok létrehozása, kapcsolat elfogadás ServerSocket s = new ServerSocket(8008); Socket incoming = s.accept(); // kapcsolat adatai Sstem.out.println("Kapcsolat a " + incoming.getinetaddress() +

" IP cimen " + incoming.getlocalport() + " portszamon"); // olvasó - író objektumok BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream())); // tájékoztató üzenet out.println("a kapott uzeneteket nagbetusre alakitjuk. Leallas be uzenetre."); out.flush(); while (true) { // a beolvasó objektumból kivesszük az üzenetet String str = in.readline(); if (str == null) { break; else { /* az üzeneteket kiírjuk és utána átalakítjuk tjpuhw QNQHNPHJIHOHOHQ Sstem.out.println("Kapott uzenet: " + str); str = str.touppercase(); VWYLVV]DLVN OGM NEL]RQ\tWpNNpQW out.println("visszakuldve: " + str); out.flush(); KDPHJIHOHO ]HQHWHWNDSXQN, kilépünk a végtelen ciklusból... if (str.trim().equals("bye")) break; //és leállítjuk a szervert incoming.close(); catch (Exception e) { Sstem.out.println("Hiba: " + e); Sstem.out.println("AllCapServer leallt"); Forráskód AktivKliens.java import java.io.*; import java.net.*; class AktivKliens { private static String bemenet; // beolvasó függvén AE extra csomagja alapján private static String beolvas() { BufferedReader be = new BufferedReader(new InputStreamReader(Sstem.in)); String bestring = ""; tr { bestring = be.readline(); catch (IOException e) { Sstem.out.println("Hiba: " + e);

return bestring; public static void main(string[] args) { tr { String host; // paraméterként is lehessen gazdagépet megnevezni if (args.length > 0 && args[0]!= null) { host = args[0]; else { host = "localhost"; // a kapcsolóelem létrehozása Socket t = new Socket(host, 8008); // az olvasó - iró objektumok BufferedReader in = new BufferedReader(new InputStreamReader(t.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(t.getOutputStream())); do { // beolvasunk a standard inputról, most DOS ablakból bemenet = beolvas(); // ezt olvastuk be és ki is írjuk Sstem.out.println("Elkuldott uzenet: " + bemenet); // most viszont átküldjük a szerverre out.println(bemenet); //itt küldi el out.flush(); // itt fogadjuk a szerver out objektuma által küldött üzeneteket String str = in.readline(); // és kiírjuk a standard kimenetre Sstem.out.println(str); // amig be üzenetet nem küldünk, erre a szerver és mi is leállunk while (!bemenet.trim().touppercase().equals("bye")); catch (Exception e) { Sstem.out.println("Hiba: " + e); A futás eredméne Tg%%./,(16(*<,'(-%.(=(/e6( +DHJ\6RFNHWDODSRQP&N GV]HUYHUDPHO\PHJDGRWWSRUWKR]NDSFVROGLN~MDEE SpOGiQ\iWDNDUMXNHOLQGtWDQLDNNRUpUWKHWHQKLED ]HQHWHWNDSXQNKLV]HQD]DGRWWSRUWRWHJ\ PiUIXWDONDOPD]iVIRJODOMDHOeUGHNHVSUREOpPDKRJ\PLW UWpQLNDNNRUKDHJ\P&N G V]HUYHUKH]W EENOLHQVVHODNDUXQNNDSFVRODWRWWHUHPWHQL,WWVHPHJ\V]HU&DIHODGDWKLV]HQD

Socket alapú kommunikáció lénege a folamatosan fenntartott kapcsolat, és ebben az HVHWEHQHJ\~MNOLHQVSURJUDPPHJ]DYDUQiDNRPPXQLNiFLW$]YLV]RQWHJ\V]HU&HQEHOiWKDW hog szálak alkalmazásával 7 egmástól független kapcsolatok hozhatók létre és ezzel már meg is oldottuk - elvben - a problémát. Ehhez persze a szervert kell átalakítani, hiszen csak a V]HUYHUWXGDW EEHJ\LGHM&NDSFVROGiVLNpUHOHPUOD]HJ\HVNOLHQVSpOGiQ\RNQHP tudhatnak egmásról. Az alábbi példaprogram olan szervert valósít meg, amel szálakon keresztül több klienst is NpSHVHJ\LGHM&OHJNH]HOQL$7KUHDGRV]WiO\EO U NtWHWW.OLHQV.H]HORRV]WiO\WKR]XQNOpWUH amelnek konstruktora eg Socket típusú objektumot vesz át és egetlen metódusa az DODSpUWHOPH]HWWUXQHOMiUiV(]D]HOMiUiVOpQ\HJpEHQDNRUiEEDQPiUPHJLVPHUWHJ\V]HU& szerver teljes kódját tartalmazza, íg eg teljes szerverpéldánnak felel meg. A kapcsolódási kérés beérkezésekor, az accept() metódus lefutásával létrejön a szál objektum és annak start() metódusa hívja meg a run() metódust. A korábban alkalmazott szerver leállításról most természetesen szó sem lehet, hiszen kliens oldalon nem tudhatunk arról, hog a többi kliens mit csinál éppen. A szál viszont leállítható és az aktív szálak számát a run() metóduson belül elhelezett activecount() függvén adja vissza. Forráskód MultiAllCapServer.java import java.io.*; import java.net.*; class KliensKezelo extends Thread { protected Socket incoming; public KliensKezelo(Socket incoming) { this.incoming = incoming; public void run() { tr { // olvasó - író objektumok BufferedReader in = new BufferedReader(new InputStreamReader(incoming. getinputstream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(incoming. getoutputstream())); // tájékoztató üzenet out.println( "A kapott uzeneteket nagbetusre alakitjuk. Szal leall be 7 Angster Erzsébet Objektumorientált tervezés és programozás 2. kötet xxx. oldal

uzenetre."); out.flush(); while (true) { // a beolvasó objektumból kivesszük az üzenetet String str = in.readline(); if (str == null) { break; else { /* az üzeneteket kiírjuk és utána átalakítjuk tjpuhw QNQHNPHJIHOHOHQ // megszámoljuk a futó szálakat is... Sstem.out.println("Jelenleg " + this.activecount() + " aktiv szal fut"); Sstem.out.println("Kapott uzenet: " + str); str = str.touppercase(); VWYLVV]DLVN OGM NEL]RQ\tWpNNpQW out.println("visszakuldve: " + str); out.flush(); KDPHJIHOHO ]HQHWHWNDSXQNNLOpS QNDYpJWHOHQFLNOXVEO if (str.trim().equals("bye")) break; //és leállítjuk a szerver szálat incoming.close(); catch (Exception e) { Sstem.out.println("Hiba: " + e); public class MultiAllCapServer { public static void main(string[] args) { Sstem.out.println("MultiAllCapServer elindult."); tr { ServerSocket s = new ServerSocket(8008); //a szerver szálakat futtató végtelen ciklus while (true) { //áll a ciklus, amíg nem jön kapcs. kérés Socket incoming = s.accept(); new KliensKezelo(incoming).start(); catch (Exception e) { Sstem.out.println("Hiba: " + e); Sstem.out.println("MultiAllCapServer leallt.");