Segédanyag: Java alkalmazások gyakorlat

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

Java Remote Method Invocation API

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

R I Szer e i r alizáció.

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

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?

Párhuzamos és Elosztott Rendszerek II

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

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

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

JNDI - alapok. Java Naming and Directory Interface

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

Stateless Session Bean

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

Szoftvertechnológia alapjai Java előadások

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

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

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

Java és web programozás

és az instanceof operátor

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

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

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

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

Programozási nyelvek Java

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

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

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

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

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

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

Bevezetés a Java programozási nyelvbe

Enterprise JavaBeans 1.4 platform (EJB 2.0)

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

Programozási nyelvek Java

Szoftvertechnológia alapjai Java előadások

Java IX. telkezelés a Java-ban

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

Java IX. telkezelés a Java-ban

Bevezetés a Java programozási nyelvbe

Programozási nyelvek II.: JAVA

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

Segédanyag: Java alkalmazások gyakorlat

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

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

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

Programozási nyelvek Java

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

Programozási nyelvek Java

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

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

Concurrency in Swing

7. K: JAVA alapok Konzultáció

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

BME MOGI Gépészeti informatika 8.

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

Java I. A Java programozási nyelv

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

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

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

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

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

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).

Java I. A Java programozási nyelv

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

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

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

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

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

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

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

Magas szintű programozási nyelvek 2 Előadás jegyzet

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

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

Elosztott rendszerek

Java Programozás 11. Ea: MVC modell

ZH mintapélda. Feladat. Felület

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

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

Kivételek. A program végrehajtása során ritkán bekövetkező események Nem a fő végrehajtási ág ; logikailag alacsonyabbrendű feladat jelzése

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

JAVA webes alkalmazások

Programozási nyelvek Java

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

Osztályok. 4. gyakorlat

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

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

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

Programozás II gyakorlat. 6. Polimorfizmus

Objektumorientált programozás C# nyelven

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

Objektumorientált Programozás VI.

Bánsághi Anna

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ás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Átírás:

Segédanyag: Java alkalmazások gyakorlat Készítette: Szabó Attila 2009/2010-2 félév, 12. gyakorlat 1 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. 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: nyilvántartást kell vezetni a távolról elérhető objektumokról, meg kell hívni az objektum megfelelő metódusát, illetve 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 Az RMI futásához szükséges komponensek az alábbi ábrán láthatóak (a nyilak feliratai a kommunikációs módot adják meg). 1. Ábra: Az RMI rendszer részei(forrás: http://java.sun.com/docs/books/tutorial/rmi/overview.html) 1

1.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. 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. (Ezt az interfészt kell a kliensnek ismernie a metódusok meghívásához.) Az rmidemo.time interfész: import java.rmi.remote; /** * 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 public synchronized String gettimestamp() throws RemoteException{ //ide jon a pontos ido megvalositasa return new String( "2010.05.04. 08:35: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 az objektumot 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"); 2

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 public static void main(string args[]) { if( args.length!= 2 ){ 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.) 1.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!). 3

Példa: -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. -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:\ELTE\PhD_IV.felev\Java_alkalmazasok_gyak\pel daprogramok\workspace\rmidemo\rmidemo.jar rmidemo.clockdisplay localhost 2 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ó. 3 Az előadáson leadott anyagok A második zárthelyi elméleti részére való felkészüléshez összefoglalom ide, hogy mikről volt szó az előadáson (zárójelben megadtam az előadások dátumát: ebből látszik, hogy a lista nem teljes, tessék a hiányzó előadások anyagát kideríteni...). A felkészüléshez használjátok a tárgy honlapján lévő diákat, a Java honlapját, na meg a Google-t, ha kell. 4

(02.19.) String/StringBuilder, és általában az immutable/final kérdéskör, a vezérlési szerkezetek (kivéve a try-catch-finally-t), a kifejezéskiértékelés, hatóköri szabályok, static tagok, megjegyzések (02.26.) csomagok, a forráskód és a class fájlok elhelyezése, classpath, paraméterátadás, túlterhelés, inline-osítás, vararg, ellenőrzött kivételek (03.19.) beágyazott osztályok (03.26.) generic-ek (04.09.) kovariancia, felüldefiniálás, @Override, clone(), equals() (04.16.) generic-ek (04.30.) generic-ek (05.07.) Thread, Runnable, életciklus, ütemezés, yield(), sleep(), blokkoló művelet, közös változók problémái, synchronized 5