Segédanyag: Java alkalmazások gyakorlat

Hasonló dokumentumok
Segédanyag: Java alkalmazások gyakorlat

Java Remote Method Invocation API

R I Szer e i r alizáció.

Java RMI Áttekintés. A Java RMI. A Java RMI architektúrája. Ficsor Lajos. Általános Infromatikai Tanszék Miskolci Egyetem 1.

Java RMI Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. javarmi / 1

Párhuzamos és Elosztott Rendszerek II

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

JNDI - alapok. Java Naming and Directory Interface

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

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

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?

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

Java és web programozás

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

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

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

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

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

Stateless Session Bean

és az instanceof operátor

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

Szoftvertechnológia alapjai Java előadások

Enterprise JavaBeans 1.4 platform (EJB 2.0)

RMI = Remote Method Invocation. Java tutorial. Kliens-szerver forgato kő nyv. Elosztott objektumok rendszere forgato kő nyv.

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

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

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

Java IX. telkezelés a Java-ban

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

Programozási nyelvek Java

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

Java IX. telkezelés a Java-ban

A Java nyelv. V. rész Az objektumorientáltság magasabb fokú tulajdonságai: Perszisztencia, CORBA, RMI

Programozási nyelvek Java

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

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

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Kommunikáció. 3. előadás

Szoftvertechnológia alapjai Java előadások

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

7. K: JAVA alapok Konzultáció

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész

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

Java. Java Message Service. ANTAL Margit. JMS API technológia. ANTAL Margit. Sapientia - EMTE

Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek.

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

Serialization. RMI működése

Bevezetés a Java programozási nyelvbe

Segédanyag: Java alkalmazások gyakorlat

Java I. A Java programozási nyelv

Bevezetés a Java programozási nyelvbe

BME MOGI Gépészeti informatika 8.

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

Java I. A Java programozási nyelv

Adatkezelés. 11. előadás (Entity Beans)

Programozási nyelvek Java

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

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

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

Concurrency in Swing

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

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

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

Programozási technológia

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

ZH mintapélda. Feladat. Felület

XML Webszolgáltatás alapú osztott alkalmazás fejlesztése Johanyák Zsolt Csaba 1

OOP: Java 8.Gy: Gyakorlás

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Osztályok. 4. gyakorlat

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

XML adatkezelés I. Az SAX szabvány. Dr. Kovács László Miskolci Egyetem Általános Informatikai Tanszék. XML adatok kezelési lehetőségei

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Java programozási nyelv 5. rész Osztályok III.

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Informatika terméktervezőknek

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

Programozási nyelvek II.: JAVA

Java Programozás 11. Ea: MVC modell

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

Programozási nyelvek Java

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

Java gyakorlat feladatai e s megolda sai ( )

Java VII. Polimorfizmus a Java nyelvben

Már megismert fogalmak áttekintése

Java biztonsági megoldások. Sandbox, Security

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

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

Kivételkezelés, naplózás. Exception handling, logging

Java VII. Polimorfizmus a Java nyelvben

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

Kivételek, kivételkezelés a C++ nyelvben

Programozási nyelvek Java

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Átírás:

Segédanyag: Java alkalmazások gyakorlat Készítette: Szabó Attila 2010/2011-2 félév, 11. gyakorlat (az előző 2 gyak közül az egyiken ZH volt, a másik szünet miatt elmaradt) 1 JAR fájl készítés A JAR (Java Archive) a Java program tömörített (.zip tömörítés), hordozható formája. JAR fájlok a jar alkalmazással készíthetőek. A fontosabb kapcsolók: Parancs jar tf foo.jar jar xf foo.jar java -jar foo.jar jar cf <mibe>.jar <miket> jar umf <miből> <mibe>.jar Funkció A foo.jar tartalmának listázása A foo.jar kicsomagolása A foo.jar fő osztályának futtatása Új.jar fájl létrehozása A.jar fájl manifest-jének kiegészítése a miből szövegfájlból A 'c' kapcsoló új archív fájl létrehozásakor használható; az 'f' kapcsoló jelzi, hogy meg szeretnénk adni az archív nevét (a.zip kiterjesztés konvenció, nem kötelező). Példa (Windows): C:\Javagyak\editor\dir 2010.03.08. 20:46 <DIR>. 2010.03.08. 20:46 <DIR>.. 2010.03.08. 20:46 751 PlainEditor$1.class 2010.03.08. 20:46 435 PlainEditor$2.class 2010.03.08. 20:46 3 409 PlainEditor.class 2010.03.04. 12:45 6 591 PlainEditor.java 4 fájl 11 186 bájt 2 könyvtár 13 727 731 712 bájt szabad C:\Javagyak\editor\cd.. C:\Javagyak\jar cf PlainEditor.jar editor C:\Javagyak\jar umf mainclass.txt PlainEditor.jar C:\Javagyak\java -jar PlainEditor.jar A mainclass.txt tartalma (a fájl végén legyen egy üres sor, mert az utolsó sor nem lesz feldolgozva): Main-Class: editor.plaineditor 2 Távoli metódushívás Java-ban (RMI) Java-ban a távoli metódushívás ( Remote Method Invocation, RMI) egy magas szintű eszköz a különböző JVM-ben (esetleg más-más gépen) futó programok kommunikációjára. Az RMI felületet nyújt ahhoz, hogy egy adott virtuális gépen futó program meghívja egy másik virtuális gépben futó programban létező objektum ( remote object ) egy metódusát úgy, mintha ez az objektum jelen lenne a hívó programban. 1

Egy RMI alkalmazás legalább két programból áll. A két programból legalább egy (de akár mindkettő) létrehoz egy objektumot, és elérhetővé teszi az objektumra mutató referenciát. Ezt az objektumot más programok elérhetik (azaz meghívhatják a metódusait), ha szereznek egy megfelelő referenciát. Ehhez a működéshez három feltételt kell biztosítani: 1. nyilvántartást kell vezetni a távolról elérhető objektumokról, 2. meg kell hívni az objektum megfelelő metódusát, illetve 3. a távolról hívható objektumok osztályait elérhetővé kell tenni. A fenti feltételek biztosításához a következő komponensekre van szükség: rmiregistry: a távolról elérhető objektumokat egy RMI regiszter tartja nyilván. Az objektumot létrehozó program ide regisztrálja be az objektumra mutató referenciát, illetve a kliens program innen kérheti le azt. RMI szerver: az objektumot megosztó program, ami az RMI regiszterbe bejegyzi a kliens által ismert néven az objektumra mutató referenciát. RMI kliens: a távoli objektum metódusát hívó program, ami az RMI regiszterből lekéri a távoli objektum eléréséhez szükséges referenciát, és meghívja valamelyik metódusát. web szerver: a kliens programnak le kell töltenie a távoli objektum osztályát (a kliens program csak egy interfészt ismer, a szerveren lévő megvalósítást futás közben tölti be a JVM). Nem szükséges web szerver akkor, ha a megfelelő osztály implementációja rendelkezésre áll a fájlrendszerben 1. Ábra: Az RMI rendszer részei(forrás: http://java.sun.com/docs/books/tutorial/rmi/overview.html) Az RMI futásához szükséges komponensek a fenti ábrán láthatóak (a nyilak feliratai a kommunikációs módot adják meg). 2.1 RMI programok felépítése Az RMI programok felépítésükben csak annyiban különböznek a megszokottaktól, hogy a távolról hívható objektumok osztályainak implementálniuk kell a java.rmi.remote interfészt egy leszármazottját. (Ezt az interfészt kell a kliensnek ismernie a metódusok meghívásához.) Szükséges továbbá, hogy a leszármazott interfész által előírt összes függvény deklarálja, hogy dobhat java.rmi.remoteexception-t. Az rmidemo.time interfész: import java.rmi.remote; 2

/** * Pontos ido szolgaltatas interfesze. */ public interface Time extends Remote { /** * Visszater a pontos idovel. */ String gettimestamp() throws RemoteException; Az rmidemo.clockengine osztály: import java.rmi.registry.locateregistry; import java.rmi.registry.registry; import java.rmi.server.unicastremoteobject; public class ClockEngine implements Time{ //implemented interfaces //a 'synchronized' biztositja, hogy egyszerre egy kliens hivja a metodust //(az esetleges tobbi kliens addig varakozik) public synchronized String gettimestamp() throws RemoteException{ //ide jon a pontos ido megvalositasa return new String( "2011.04.28. 012:55:00" ); //main public static void main(string[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); try { String name = "Time"; //egy egyszeru objektum, amit meg fogunk osztani RMI-n keresztul Time engine = new ClockEngine(); //hozzaferhetove teszi a megadott objektumot a megadott porton Time stub = (Time) UnicastRemoteObject.exportObject(engine, 0); //lekeri az RMI registry-t Registry registry = LocateRegistry.getRegistry(); //regisztralja az objektumot a megadott nevvel registry.rebind(name, stub); System.out.println("ClockEngine bound"); catch (Exception e) { System.err.println("ClockEngine exception:"); e.printstacktrace(); Az rmidemo.clockdisplay osztály: import java.rmi.registry.locateregistry; import java.rmi.registry.registry; public class ClockDisplay { //main 3

public static void main(string args[]) { if( args.length!= 1 ){ System.out.println( "Usage: ClockDisplay <hostname>" ); if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); try { String name = "Time"; //lekeri a registry-t az elso parameteben megadott geprol Registry registry = LocateRegistry.getRegistry(args[0]); //nev alapjan lekeri a tavoli objektumra mutato referenciat Time time = (Time) registry.lookup(name); //meghivja a tavoli objektum metodusat String currenttime = time.gettimestamp(); System.out.println("Current time: " + currenttime); catch (Exception e) { System.err.println("ClockDisplay exception:"); e.printstacktrace(); Az inkonzisztens állapot elkerüléséhez a megosztott objektumok implementációjában használjunk synchronized metódust! (Egy objektum szinkronizált metódusának meghívásától annak lefutásáig egyetlen másik szál sem hívhatja az objektum szinkronizált metódusait.) Fontos: a távoli metódushíváskor a kliens gép elküldi a metódus paramétereit a szervernek, és a szerver visszaküldi a metódus visszatérési értékét. A küldés lebonyolításához a paraméter objektumok és a visszatérési érték objektum osztályainak szerializálhatónak kell lenniük! A szerializáció lényege, hogy egy osztály objektumainak állapota elmenthető legyen bájt sorozatként. A beépített Java típusok szerializálhatóak (String, Integer, Double, stb.), és ez a gyakon elég is lesz: ha szükségetek van rá, nézzetek utána hogyan lehet egy tetszőleges osztályt szerializálhatóvá tenni 1. 2.2 RMI programok futtatása A futtatáshoz szükség van néhány JVM paraméterre, és egy policy fájlra. A távolról meghívandó objektumok osztályait el kell helyezni a kliens által hozzáférhető helyen, mondjuk egy jar fájlban. Ezen kívül el kell indítani az rmiregistry programot, ami megtalálható a jre bin könyvtárában. A policy fájl szabályozza a beregisztrált objektumhoz történő hozzáférést: grant { ; permission java.security.allpermission; A szerver JVM paraméterei: -Djava.security.policy: az egyenlőségjel után meg kell adni a policy fájl helyét, illetve nevét (a lentebbi példában a fájl az aktuális könyvtárban van, és nincs kiterjesztése!). -Djava.rmi.server.codebase: az egyenlőségjel után meg kell adni a távoli objektumok implementációinak elérhetőségét (lásd a lenti példát). Ha a jar a neten érhető el, akkor az URL-t kell megadni, ha elérhető lokálisan, akkor a file:/ előtag után meg kell adni a 1 Pl. itt: http://java.sun.com/developer/technicalarticles/programming/serialization/ 4

Példa: hivatkozást. -Djava.rmi.server.hostname: az egyenlőségjel után meg kell adni a szerver nevét (lásd a lenti példát). E:\java -Djava.security.policy=policy -Djava.rmi.server.codebase=file:/E:\workspace\RMIDemo\rmidemo.jar -Djava.rmi.server.hostname=localhost rmidemo.clockengine A kliens JVM paraméterei: Példa: -Djava.security.policy: az egyenlőségjel után meg kell adni a policy fájl helyét, illetve nevét (a lentebbi példában a fájl az aktuális könyvtárban van, és nincs kiterjesztése!). -Djava.rmi.server.codebase: az egyenlőségjel után meg kell adni a távoli objektumok implementációinak elérhetőségét (lásd a lenti példát). Ha a jar a neten érhető el, akkor az URL-t kell megadni, ha elérhető lokálisan, akkor a file:/ előtag után meg kell adni a hivatkozást. E:\java -Djava.security.policy=policy -Djava.rmi.server.codebase=file:/E:\workspace\RMIDemo\rmidemo.jar rmidemo.clockdisplay localhost 3 Feladatok 1. Írd meg a 8. gyakorlaton bemutatott EchoServer osztályt úgy, hogy nem socket-en keresztül lehet elérni a szolgáltatását, hanem egy megosztott objektum segítségével! Készítsd el a kliens programot is! Használj szinkronizált metódust. 2. Írj egy távolról hívható kalkulátort (csinálj hozzá tesztklienst is)! Az interfész: import java.rmi.remote; public interface Calculator extends java.rmi.remote { public long add(long a, long b) throws java.rmi.remoteexception; public long sub(long a, long b) throws java.rmi.remoteexception; public long mul(long a, long b) throws java.rmi.remoteexception; public long div(long a, long b) throws java.rmi.remoteexception; 3. Írj egy távoli naplózó programot! A naplózó tudja rögzíteni az új bejegyzéseket, illetve lekérhető tőle a teljes napló. 5