Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
JAVA - przegląd możliwości
Mateusz Nomańczuk Java - zaawansowane możliwości
2
Wprowadzenie Java to coś więcej niż narzędzie do pisania apletów
Wersja Enterprise oferuje: Java Database Connectivity (JDBC) Servlety Java Native Interface (JNI) Remote Methods Invocation (RMI) Java IDL (CORBA) Java Naming and Directory Interface (JNDI) Enterprise Java Beans (EJB) Założenia wstępne Nie będziemy mówić o tym o czym wszyscy wiedzą: że Java jest niezależna od platformy sprzętowej i systemowej, że jest językiem bardzo zorientowanym obiektowo, że środowisko programistyczne jest dostępne nieodpłatnie także do zastosowań komercyjnych, że doskonale komponuje się z Corbą, że posiada BARDZO silne wsparcie wielowątkowości, że (...) Postaramy się udowodnić, że przy użyciu Javy można zrobić coś więcej niż kolorowe aplety na stronach WWW. Będziemy przedstawiać fragmenty kodu obrazujące omawiane tematy, pomagające je lepiej zrozumieć, a także ciekawe rozwiązania i itd. Przyjmujemy, że wszyscy studenci, którzy ukończyli kurs inżynierski znają podstawy tego języka; dzięki podobieństwu składniowym z C++ oraz obiektowym charakterze przykłady będą zrozumiałe dla wszystkich. Java - zaawansowane możliwości
3
Lista tematów JDBC Serializacja Programowanie sieciowe RMI
Podstawy Porównanie z Corbą Enterprise JavaBeansProgramowanie sieciowe Servlety Corba – succesfull stories Konkrety. JDBC (Java Database Connectivity) umożliwia połączenie aplikacji (oraz apletów) pisanych w Javie z relacyjnymi bazami danych. Jest to narzędzie generyczne, podobne do ODBC – istnieje także możliwość połączenia JDBC z ODBC za pomocą tzw. mostu. Serializacja – jako sposób na zapisywanie obiektów (wraz z ich stanem) do strumieni co daje możliwość zapisania ich dysk lub przesłania przez sieć. Pojęcie serializacji jest konieczne do zrozumienia RMI ponieważ obiekty będą przesyłane między aplikacjami – pierwsza i podstawowa różnica między RMI a Corbą, gdzie przysyłane są wyłącznie referencje do obiektów. Programowanie sieciowe – za pomocą tzw. gniazd (sockets) przy użyciu protokołu TCP oraz UDP. Wykorzystuje serializację do przesyłania obiektów za pomocą strumieni podłączonych do gniazd. RMI (Remote methods invocation) – system pozwalający obiektom napisanym w Javie działającym na jednej wirtualnej maszynie wywoływać metody obiektów wykonywanych przez inną. Podstawy – trochę teorii i przedstawienie prostego przykładu wraz z instrukcją jak go uruchomić Porównanie z Corbą – zestawienie cech obu systemów Java - zaawansowane możliwości
4
Dlaczego wybrać Javę ? Aplikacje Javy są niezależne od architektury - Write Once Run Anywhere Aplety jako bezproblemowi klienci Łatwa modyfikacja kodu Nie wymaga instalacji Architektura komponentowa – Java Beans Bezpieczeństwo – securityManager Wykorzystanie wieloprocesorowych maszyn Niezależność – w dzisiejszych czasach większość firm posiada heterogeniczne systemy komputerowe jak Unix, Windows, Mac. Zamiast tworzyć osobne wersje oprogramowania dla każdej z tych platform warto rozważyć możliwości Javy, która realizuje założenie WORA (Write Once Run Anywhere) Aplet Javy doskonale sprawdza się jako prosty klient aplikacji. Jego kod każdorazowo ściągany jest z serwera HTTP więc nie ma problemu ze zmianą kodu. Ponadto może być uruchomiony wszędzie bez konieczności instalacji Aplikacja może być zbudowana z modułów urzeczywistniając ideę Plug-and-play. Bezpieczeństwo – ściśle określa się prawa aplikacji napisanych w Javie do zasobów komputera Wielowątkowość automatycznie wykorzystuje obecność wielu procesorów w systemie Java - zaawansowane możliwości
5
JDBC Czym jest JDBC ? Architektura JDBC Ciekawe cechy JDBC w działaniu
Java - zaawansowane możliwości
6
Czym jest ODBC ? Podstawowe założenia ODBC
JDBC to coś więcej niż nowa wersja ODBC ! Podstawowe elementy pakietu java.sql Klasy łączące z bazą danych Wyrażenia SQL Zestawy rekordów Metadane inne Łatwo będzie wprowadzić w temat zaczynając od ODBC – standardu, który wszyscy znają i którego wszyscy używali. ODBC to API oparte na języku C służące do łączenia z relacyjnymi bazami danych. Swoją popularność zawdzięcza prostocie obsługi – dzięki niemu programista nie musi zastanawiać się jaki SZBD będzie zarządzał danymi – staje się zupełnie przezroczysty. System ODBC (driver manager) przekazuje wyrażenia SQL do dostarczonego przez producenta bazy danych sterownika, który łączy się ze wskazaną bazą, wykonuje zlecenie i zwraca wynik - w łatwej do dalszego wykorzystania formie. Dzięki swoim zaletom ODBC szybko stało się przemysłowym standardem obsługując praktycznie wszystkie istniejące na rynku bazy danych nie tylko na platformie Windows ale także na UNIXie. Znając popularność ODBC nie należy się dziwić, że JDBC zostało zainspirowane tym standardem. Jednak nic poza tym – JavaSoft (oddział Suna) opracował JDBC od podstaw w kooperacji z wieloma partnerami (m.in. IBM, Oracle, Sybase, Informix) co zapewnia szerokie wsparcie dla tej technologii. Wszystko to obecne jest w pakiecie java.sql zawartego w standardowej edycji JDK. Użycie JDBC zapewnia kompletną niezależność od platformy oraz SZBD. Oznacza to możliwość przeniesienia aplikacji w zupełnie inne środowisko bez konieczności zmiany kodu. To bardzo silna cecha w połączeniu z przenaszalnością samej Javy. Podstawowe elementy: Klasy łączące – znowu wygodnie będzie posłużyć się znanym przykładem. Tym razem mowa o Microfotowym ADODB. Jest to klasa dokonująca fizycznego połączenia z systemem bazy danych Wyrażenia SQL to specjalne obiekty, które zawierają zapytania (oraz inne wyrażenia SQL) kierowane za pomocą klas łączących do bazy danych Zestawy rekordów – wszystkim znane result sets – zawierają dane zwrócone przez bazę danych w łatwej do dalszej obróbki postaci Metadane – z tego co mi wiadomo element nieznany w ODBC. Dane o danych – informacja o strukturze bazy danych i innych takich. Java - zaawansowane możliwości
7
Java - zaawansowane możliwości
8
Architektura JDBC API dzieli się na: Typy sterowników
Poziom przetwarzania wyrażeń SQL i realizacji połączeń z bazą Poziom sterowników dedykowanych SZBD Typy sterowników Most JDBC-ODBC plus sterownik ODBC Sterownik napisany cześciowo w Javie wykorzystujący natywne API Sterownik w czystej Javie Sterownik w czystej Javie plus natywne protokoły Co widać na rysunku – w skrócie bo jest tego dużo. Najważniejszą rolę spełnia JDBC Driver Manager – służy do połączenia aplikacji Javy z jednym z czterech typów sterowników oraz przekazywania wyników zapytań. Prawie wszystkie SZBD oferują własne rozszerzenia standardu SQL. Jakkolwiek ścisłe stosowanie się do wymogów standardu zapewni pełną kompatybilność z każdą bazą danych, JDBC umożliwia wykorzystanie specyficznych cech posiadanych systemów bazodanowych. Typy sterowników: JDBC-ODBC. Integralna część pakietu JDBC – tłumaczy wołania JDBC na ODBC. Stanowi doskonały (często jedyny) sposób na połączenie z małymi bazami danych jak FoxPro czy Access. Ponadto może dobrze służyć do połączenia Javy z wypróbowanymi i z powodzeniem używanymi sterownikami ODBC do istniejących baz danych (systemy spadkowe). Takie połączenie nie jest jednak możliwe do wykorzystania przez aplety ponieważ sterowniki ODBC w formie natywnego kodu muszą być zainstalowane na każdej maszynie klienta oraz na serwerze bazy danych. ODBC sprawdza się w architekturze dwuwarstwowej działającej w sieci LAN. Native API partly Java driver. To najczęściej osłona (wrapper) istniejącego dostarczonego przez producenta sterownika, który z kolei wykorzystuje protokół specyficzny dla danego SZBD jak Oracle Call Interface (OCI). Taki sterownik w locie konwertuje komendy JDBC generowane przez aplikację w Javie do postaci rozumianej przez SZBD oraz konwertuje odpowiedź tak aby spełniała standardy JDBC. Pomimo że sterowniki tego typu nie korzystają z ODBC wymagają natywnego kodu w postaci sterowników specyficznych dla SZBD (jak Oracle Net8) zainstalowanych na każdej maszynie klienta. Z tego powodu nie powinny być używane przez aplety. Możliwe jest jednak wykorzystanie ich w architekturze RMI lub w Servletach. JDBC-Net pure Java Driver. Nie wymaga natywnego kodu uruchomionego na komputerze klienta. Używa standardowego protokołu sieciowego do komunikacji z serwerem, który z kolei łączy się z bazą danych używając ODBC lub dostarczonego przez producenta natywnego sterownika bazy danych. Ponieważ sterownik tego typu implementowany jest w czystej Javie stanowi idealny wybór zarówno dla aplikacji jak i apletów. Native-protocol pure Java. Implementowane są, podobnie jak poprzednie, w czystej Javie. Zasadniczo wykorzystują specyficzny dla SZBD protokół i na ogół dostarczane są właśnie z SZBD. Zaletą jest bezpośrednie połączenie – z ominięciem warstw ODBC – co zapewnia wysoką wydajność. Możliwe do użycie zarówno z aplikacjami jak i apletami. Java - zaawansowane możliwości
9
Wybór sterownika Architektura dwuwartstowa Architekrura trzywarstwowa
Java - zaawansowane możliwości
10
JDBC w działaniu Uruchomienie sterownika Nawiązanie połączenia z bazą
Wykonanie wyrażenia SQL executeQuery() executeUpdate() execute() Java - zaawansowane możliwości
11
Uruchomienie sterownika
try { DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); } catch (SQLException e) { e.printStackTrace(); } Jest to przykład wykorzystania tzw. cienkiego drivera dostarczanego przez firmę Oracle. Jego instalacja sprowadza się do ustawienia odpowienich ścieżek (CLASSPATH) dla wirtualnej maszyny i gotowe. Dwa stringi zawierają nazwę i hasło użytkownika, DriverManager jest odpowiedzialny za zarządzanie i rejestrację sterowników w systemie. Try i catch – ponieważ operacja może podnieść wyjątek SQLExeption będący częścią pakietu java.sql Java - zaawansowane możliwości
12
Połączenie z bazą danych
String userName = „scott”; String userPasswd = „tiger”; try { Connection conn = DriverManager.getConnection } catch (SQLException e) { e.printStackTrace(); } Jdbc:oracle:thin – to nazwa sterownika – a konkretnie klasy sterownika compDB – to nazwa maszyny, na której zainstalowany jest SZBD. Może być np. URL w postaci adresu IP 1521 – to port, w tym przypadku standardowy port TCP, na którym słucha ORACLE Try i catch – ponieważ operacja może podnieść wyjątek SQLExeption będący częścią pakietu java.sql Java - zaawansowane możliwości
13
Wykonanie wyrażenia SQL
Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery( „Select * from Emp”); Do uruchomienia wyrażenia SQL potrzebny jest obiekt klasy Statement uzyskiwany z utworzonego uprzednio obiektu reprezentującego połączenie z bazą danych. W zależności od potrzeb klasa Statement oferuje następujące metody: executeQuery() – dla Selectów executeUpdate() – dla wyrażeń DML (Data Manipulation Language) czyli INSERT, UPDATE, DELETE, a także wyrażenia typu DDL jak CREATE TABLE. Metoda zwraca inta informującego o liczbie krotek, których dotyczyła operacja execute() – używany gdy typ wykonywanego zapytania zależy od przebiegu programu (arbitraty query). Metoda ta zwraca wartość logiczną – prawda jeżeli następnym wynikiem będzie ResultSet lub fałsz jeżeli będzie nim liczba charakterystyczna dla wyrażeń DML. Java - zaawansowane możliwości
14
Przeglądanie wyników while( res.next()){ int idNumber
= res.getInt(„empno”); String name = res.getString(„ename”); // ... przetwarzanie danych ... } Działanie podobne jak we wszystkich znanych językach programowania – uzyskujemy obiekt-kolekcję (res) zawierający rekordy, nawigujemy za pomocą metody next(), zmiennym lokalnym przypisujemy wartości pobrane z tej kolekcji -> jesteśmy gotowi do przetwarzania danych. Java - zaawansowane możliwości
15
Dodatkowe możliwości Przygotowywanie prekompilowanych wyrażeń SQL
Wywoływanie składowanych procedur i funkcji Metadane Transakcje Integracja JDBC z RMI Użycie prekompilowanych wyrażeń przyspiesza wykonanie często wykorzystywanych wyrażeń poprzez skrócenie czasu przygotowania. Sterownik bazy musi udostępniać taką możliwość. Wywołanie składowanych procedur i funkcji – jasne Metadane – mamy dostęp do informacji np. o schemacie bazy danych czy zwróconym zestawie rekordów. Wykorzystanie metadanych jest nieodzowne podczas tworzenia narzędzi generycznych Transakcje – są również wspierane przez JDBC pod warunkiem posiadania odpowiedniego sterownika JDBC. Java - zaawansowane możliwości
16
Podsumowanie JDBC JDBC zapewnia dostęp do bazy niezależny od platformy oraz SZBD JDBC udostępnia łatwe do użycia API Cztery rodzaje sterowników zapewniają optymalne wykorzystanie SZBD dostosowane do indywidualnych potrzeb Rozwój JDBC – tworzona wersja 2.0 Wersja 2.0 przewidywane wsparcie dla EJB wykorzystanie Java Naming and Directory Interface (JNDI) – możliwe będzie lokalizowanie serwerów za pomocą logicznej nazwy zamiast URLa. Connection Pooling – dalsze udoskonalenie cacheowania operacji na bazie danych celem zapewnienia wyższej wydajności Wsparcie dla rozległych transakcji (Distributed Transaction Support) – udostępniający dwuetapowy commit. Java - zaawansowane możliwości
17
Serializacja Wprowadzenie Przykład zapisu obiektu do pliku
Przykład transmisji obiektu przez sieć Dodatkowe możliwości Podsumowanie Wprowadzenie – powiem co to jest i do czego może być użyta serializacja Przykład 1 – ilustruje wykorzystanie serializacji do zapisania stanu obiektu zdefiniowanej przez nas klasy Osoba do pliku, a następnie „odzyskanie” obiektu wraz z jego składowymi Przykład 2 – pokazuje główne zastosowanie serializacji – transmisję obiektów przez sieć. Mechanizm ten leży u podstaw takich technologii jak RMI czy EJB ? Dodatkowe możliwości – postaram się krótko powiedzieć co jeszcze można osiągnąć stosując serializację – autoryzacja dostępu do serializowanych obiektów, kodowanie serializowanych obiektów celem bezpiecznej transmisji, zarządzanie wersjami oraz kompresję Podsumowanie – kilka słów na koniec tematu serializacja Java - zaawansowane możliwości
18
Serializacja - wprowadzenie
Serializacja pozwala na zapisanie stanu obiektu w strukturalnej postaci Jak to działa ? java.io.Serializable NotSerializableException Strukturalna postać oznacza tablicę bajtów. Taka tablica może być zapisana do pliku lub przesyłana przez sieć za pomocą połączenia opartego na gniazdach lub RMI. Proces serializacji zachowuje wystarczająco informacji o obiekcie żeby z powodzeniem odtworzyć jego stan – deserializacja. Z punktu widzenia programisty cały proces jest w znacznym stopniu przezroczysty. Cała sprawa sprowadza się do implementowania interfejsów java.io.Serializable bądź Externalizable. Pierwszy z nich powinien być wystarczający do większości zastosowań jakkolwiek Externalizable daje większą kontrolę nad procesem serializacji. Wszystkie obiekty, które mają zostać poddane serializacji muszą implementować ten interfejs. W tym jeżeli mamy doczynienia z obiektem złożonym to wszystkie składowe muszą implementować ten interfejs. Większość standartowych składowych JDK implementują Serializable. Co ciekawe jeżeli spojrzymy na implementację Serializable to to jest ona pusta ! Jego zadaniem jest wyłącznie wskazanie, że implementująca go klasa może zostać zserializowana. jeżeli zadeklarujemy zgodność z Serializable a któraś ze składowych go nie implementuje dostaniemy NotSerializableException Java - zaawansowane możliwości
19
Klasa osoba public class Osoba implements java.io.Serializable {
private int id; private String imie; private String nazwisko; // ... public int getId() { return id; } public void print() { System.out.println("ID: " + id); Ten przykład pokazuje zapisanie obiektów klasy Osoba do pliku a następnie ich odczytanie. Udowadniam w ten sposób, że stan obiektów jest faktycznie zapisywany – wywołujemy metodę print(), która wyświetla informacje zapisane w serializowanym obiekcie. Jedyna ciekawa rzecz to implementacja interfejsu Serializable. Jak mówiłem wcześniej wszystkie obiekty poddawane serializacji muszą implementować ten interfejs. Java - zaawansowane możliwości
20
Klasa ZachowajOsobe import java.io.*; import java.util.Vector;
public class ZachowajOsobe { public static void main(String[] args) { Vector osoby = new Vector(); employees.addElement(new Osoba(1,"Jan","Kowalski")); try { FileOutputStream fos = new FileOutputStream(„baza.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(employees); oos.flush(); oos.close(); } catch (IOException e) {} } Import io i Vectora Vector osoby będzie zawierał osoby, które chcemy zapisać. Z braku miejsca dodałem tylko jedną. FileOutputStream to konstrukcja, która umożliwia sekwencyjny zapis do pliku dyskowego. Konstruktor przyjmuje nazwę pliku, do którego jest podłączony strumień. ObjectOutputStream – to strumień potrafiący serializować obiekty – czyli zapisywać je w postaci płaskiego strumienia bajtów. Podłączamy jego wyjście do wejścia strumienia plikowego Metoda writeObject(Object co) – dokonuje zapisu dostarczonego argumentu do strumienia. Sedno serializacji ! Metoda flush() – zapewnia fizyczny zapis żeby wyeliminować ewentualne opóźnienia spowodowane np. buforowaniem. Close() zamyka strumień i zwalnia zajmowane przez niego zasoby. Mogą pojawić się różne wyjątki ale w tak prostej aplikacji nie będziemy zajmować się ich szczegółowym wyłapywaniem więc przechwytujemy wyjątek operacji wejścia-wyjścia – IOException. Java - zaawansowane możliwości
21
Klasa CzytajOsobe import java.io.*; import java.util.Vector;
public class CzytajOsobe { public static void main(String[] args) { Vector osoby = new Vector(); try { FileInputStream fis = new FileInputStream("baza.ser"); ObjectInputStream ois = new ObjectInputStream(fis); osoby = (Vector) ois.readObject(); ois.close(); for (int i = 0; i < osoby.size(); i++) { Osoba osoba = (Osoba)osoby.elementAt(i); osoba.print(); } // for } catch (Exception e) {} } Podobnie jak poprzednio – import io oraz Vector Tworzony jest Vector, na który zapiszemy odczytane osoby – musi być to taka sama struktura jak zapisana bo będziemy wykonywać casta (Vector)ois.readObject() Tworzenie strumieni: obiektowego i plikowego Metoda ois.readObject() wykonuje pracę odwrotną do writeObject() – sedno deserializacji ! Dla każdej z odczytanych osób wykonuje metodę print(). Niezbędny cast z elementu Vectora (a więc typu Object) do Osoby Możliwe wyjątki – jest ich wiele więc ogólna klasa Exception. Java - zaawansowane możliwości
22
Serializacja – Klient public class SerialClient {
import java.io.*;import java.net.*;import java.util.*; public class SerialClient { public static void main(String[] args) { // ... Deklaracja obiektów try { me = new Osoba(1, "Jan", "Kowalski"); client = new Socket("localhost", 8080); objOut = new ObjectOutputStream(client.getOutputStream()); objIn = new ObjectInputStream(client.getInputStream()); me.print(); long marker1 = new Date().getTime(); Ten przykład natomiast ilustruje przesyłanie obiektów w architekturze klient – serwer. Deklaracja obiektów zawiera deklarację takich zmiennych jak: Osoba me, gniazdo klienta (socket), strumienie obiektów wyjściowe i wejściowe. Java - zaawansowane możliwości
23
objOut.writeObject(me); me = (Osoba)objIn.readObject();
long marker2 = new Date().getTime(); long diff = marker2 - marker1; System.out.println("Czas transmisji:" + new Long(diff).toString()+"ms"); me.print(); } catch (Exception e){ e.printStackTrace(); } } // main } // SerialClient objOut.writeObject(me) – podobnie jak poprzednio zapisuje obiekt (me) do strumienia, który tym razem podłączony jest do socketu a nie do strumienia plikowego objIn.readObject() – bardzo ważna metoda ! Wykonanie programu zostaje zatrzymane aż do momentu otrzymania danych z obiektowego strumienia wejściowego objInt. Dane zostają castowane (Osoba) na obiekt typu osoba i zapisane na zmiennej me Następuje porównanie dat celem sprawdzenia ile czasu zajął transfer Wypisanie na ekran danych żeby sprawdzić co tak na prawdę przyszło z sieci. Java - zaawansowane możliwości
24
Serializacja - Serwer public class SerialServer extends Thread {
import java.net.*; import java.io.*; import java.util.*; public class SerialServer extends Thread { private Socket channel; private ObjectOutputStream objOut; private ObjectInputStream objIn; public SerialServer(Socket s) { channel = s; try { objOut = new ObjectOutputStream(channel.getOutputStream()); objIn = new ObjectInputStream(channel.getInputStream()); } catch (Exception e) {} } Sprawdźmy teraz co robi serwer. Dla przypomnienia – klient po wysłaniu obiektu osoby czeka na dane. Bardzo ważne – serwer dziedziczy z klasy Thread – co oznacza, że jest wielowątkowy ! Oznacza to, że może obsługiwać potencjalnie wielu klientów, dla których tworzy osobne wątki. Deklarowana jest zmienna klasowa channel typu Socket Konstruktor przypisuje zmiennym klasowym odpowiednie strumienie Java - zaawansowane możliwości
25
osoba = (Osoba)objIn.readObject(); osoba.print();
public void run() { Osoba osoba = null; try { osoba = (Osoba)objIn.readObject(); osoba.print(); } catch (Exception e) {} osoba.setName("Maria"); objOut.writeObject(osoba); } catch (Exception e) { e.printStackTrace(); } Każdy wątek serwera posiada metodę run() wywoływaną po jego utworzeniu. Ta metoda powoduje zatrzymanie pracy wątku (omawiana już wcześniej metoda readObject()) do momentu otrzymania danych na strumieniu wejściowym – objIn Po otrzymaniu obiektu następuje cast do Osoby, zmiana imienia na Maria i odesłanie przez strumień wyjściowy objOut to klienta. Skąd wiadomo gdzie jest klient ? – wyjaśnione dalej. Java - zaawansowane możliwości
26
public static void main(String[] args) { try { ServerSocket server =
new ServerSocket(8080); while (true) { Socket channel = server.accept(); SerialServer newSerial = new SerialServer(channel); newSerial.start(); } } catch (Exception e) { e.printStackTrace(); Socket serwera działa na porcie 8080, W pętli nieskończonej serwer czeka na podłączenie do socketu (server.accept() – była mowa podczas networking). Następnie tworzy nowy wątek przekazując mu sposób na komunikację z klientem (jego socket). Dalej startuje wątek. Java - zaawansowane możliwości
27
Dodatkowe możliwości Kompresja ZIP Zaawansowana serializacja
klasa GZIPInputStream Zaawansowana serializacja interfejs Externalizable Szyfrowanie strumieni Zarządzanie wersjami GZIP – przy niewielkich przeróbkach można uzyskać kompresję strumieni. Sprowadza się to do podłączenia klasy GZIPInputStream i GZIPOutputStream między obiekty a strumienie wyjściowe / wejściowe. Ten interfejs, w przeciwieństwie do interfejsu Serializable, nie jest pusty i zawiera metody writeExternal i readExternal, za pomocą których można szczegółowo określić jak powinna przebiegać serializacja dla danego obiektu. Istnieją standardowe klasy służące do kodowania / dekodowania strumieni przy użyciu wielobajtowych kluczy szyfrujących Zarządzanie wersjami – w sytuacji kiedy zmienia się struktura klasy serializowanego obiektu istnieje możliwość zachowania kompatybilności Java - zaawansowane możliwości
28
Serializacja - podsumowanie
Serializacja to bardzo ważny mechanizm, który jest wykorzystywany w takich zaawansowanych technologiach jak RMI czy EJB Przesyłanie serializowanych obiektów przez sieć (nawet skompresowanych) na większą skalę jest mało wydajne Java - zaawansowane możliwości
29
Networking Podstawowe pojęcia Przykład połączenia dwóch aplikacji Port
Socket InputStream OutputStream Przykład połączenia dwóch aplikacji Java - zaawansowane możliwości
30
Przykład - Klient import java.net.*;import java.io.*;
public class Client { InetAddress addr = InetAddress.getByName("remote.server.com"); Socket socket = new Socket(addr, 8080); try { PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream( ))),true); for(int i = 0; i < 10; i ++) out.println("test " + i); out.println("END"); } finally { socket.close(); } Java - zaawansowane możliwości
31
Przykład - Serwer import java.io.*; import java.net.*;
ServerSocket s = new ServerSocket(8080); try { Socket socket = s.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String str = in.readLine(); if (str.equals("END")) break; System.out.println("Echoing: " + str); } socket.close(); s.close(); Java - zaawansowane możliwości
32
RMI Wprowadzenie Prosta aplikacja w RMI
Aplikacja wykorzystująca callback Zdalna aktywacja obiektów Porównanie: RMI CORBA Wprowadzenie – omówię krótko co to jest RMI. Była już o tym mowa wcześniej we wstępie. Prosta aplikacja w RMI. Wyjaśnienie krok po kroku co trzeba zrobić żeby zobaczyć RMI w akcji Callback – sytuacja, w której zostaje zatarta tradycyjna różnica między klientem a serwerem – obie strony mogą wywoływać nawzajem swoje metody Zdalna aktywacja obiektów – jak sugeruje nazwa Remote Object Activation to funkcja pozwalająca na aktywację (czyli załadowanie do pamięci) klasy serwera dopiero po otrzymaniu pierwszego żądania dostępu do implementowanej przez niego metody. Jest to bardzo proste w użyciu – jak zwykle sprowadza się do zaimplementowania pewnego interfejsu lub dziedziczenia funkcjonalności ze specjalnej nadklasy. W przypadku ROA mamy doczynienia z drugim przypadkiem, nadklasa do dziedziczenia jest Activatable. Jeżeli zachodzi potrzeba aby obiekty pomiędzy aktywacjami (czyli w czasie gdy są nieaktywne) zachowywały swój stan istnieje możliwość stosunkowo łatwego zapisu do pliku wszystkich ważnych parametrów w postaci serializowanej. Porównanie – NA KONIEC przedstawię podobieństwa i różnice między tymi dwoma systemami uwzględniając najważniejsze cechy wspólne systemów rozproszonych Java - zaawansowane możliwości
33
RMI - wprowadzenie Co to jest RMI ? Jakie są ograniczenia ?
RMI jako warstwa pośrednia Przed pojawieniem się JDK1.1 zaprojektowanie złożonej aplikacji sieciowej było bardzo trudne ponieważ należało proceduralne techniki programowania socketowego przenieść w środowisko obiektowe. Taka aplikacja wymaga zdefiniowania własnego protokołu, za pomocą którego będą komunikowały się klient z serwerem – określenie znaczenia komunikatów, przesyłanie danych, szczegóły transmisji itp. Dzięki wprowadzonemu wraz z JDK1.1 RMI programowanie aplikacji sieciowej może odbywać się na o wiele wyższym poziomie abstrakcji. Obiekty Javy mogą teraz w prosty sposób wywoływać metody obiektów odległych (remote) w identyczny sposób co obiektów lokalnych. A więc Remote Method Invocation to system pozwalający komunikować się obiektom działającym pod kontrolą różnych wirtualnych maszyn javy tak jakby działały lokalnie. Pierwszym i podstawowym ograniczeniem, jakie narzuca wybór RMI jest konieczność implementowania wszystkich obiektów w Javie. RMI jest szczególnie przydatne podczas tworzenia wielowarstwowych mostów (warstw pośrednich) między technologiami Javovymi jak JDBC, JNI, CORBA Java - zaawansowane możliwości
34
RMI – przykład aplikacji
Zdefiniować zdalny interfejs Stworzyć zdalny obiekt implementujący zdalny interfejs Stworzyć klienta Skompilować źródła Wygenerować pieńki oraz szkielety Uruchomić rejestr RMI Uruchomić zdalne obiekty (serwery) Uruchomić klienta Java - zaawansowane możliwości
35
RMI – definicja interfejsów
public interface OsobaInterface extends java.rmi.Remote { public Osoba szukaj(int empID) throws java.rmi.RemoteException; } Reguły tworzenia interfejsów: Wszystkie zdalne interfejsy muszą dziedziczyć (bezpośrednio lub pośrednio) z java.rmi.Remote Każda metoda zdefiniowana w takim interfejsie deklarować wyjątek RemoteException Podczas wywołań RMI wszystkie proste typy danych i obiekty lokalne są przekazywane przez wartość (w przeciwieństwie do wołań lokalnych gdzie są przekazywane przez referencję). Obiekty zdalne natomiast przekazywane są przez referencję Wszystkie obiekty przekazywane przez RMI muszą implementować interfejs Serializable – żeby mogły zostać „spłaszczone” podczas marszalingu / demarszalingu. Większość klas standardowo obecnych w JDK implementuje ten interfejs. Nasza klasa Osoba standardowa nie jest więc musi go implementować explicite. Java - zaawansowane możliwości
36
RMI – klasa Osoba public class Osoba implements java.io.Serializable {
private int id; private String imie; private String nazwisko; public Osoba(int id, String imie, String nazwisko) { this.id = id; this.imie = imie; this.nazwisko = nazwisko; } public int getId() { return id; } public void print() { System.out.println("ID: " + id); System.out.println("Imie: "+ imie); System.out.println("Nazwisko: " + nazwisko); Jasna sprawa. Java - zaawansowane możliwości
37
RMI – tworzenie serwera
import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class OsobaServer extends UnicastRemoteObject implements OsobaInterface { Java - zaawansowane możliwości
38
RMI – tworzenie serwera 2
public Osoba szukaj(int id) throws RemoteException { // ... for (int i = 0; i < osoby.length; i++) { if (id == osoby[i].getId()) return osoby[i]; } return null; } // ... Zakładamy, że stworzyliśmy wektor zawierający obiekty typu osoba. Metoda szukaj (deklarowana w interfejsie) zwraca osobę, jeżeli znajduje się ona w tym wektorze. Java - zaawansowane możliwości
39
RMI – tworzenie serwera 3
public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { // ... OsobaServer myOsobaServer = new OsobaServer("SerwerOsob"); Naming.bind("/SerwerOsob", myOsobaServer); } catch (Exception e) {} } // ... } Java - zaawansowane możliwości
40
RMI – tworzenie klienta
import java.rmi.*; public class OsobaClient { public static void main(String[] args){ // ... try { OsobaInterface osobaReference = (OsobaInterface)Naming.lookup("/SerwerOsob"); Osoba osoba = osobaReference.szukaj(id); } Java - zaawansowane możliwości
41
RMI - uruchamianie Kompilacja klas Tworzenie pieńków [i szkieletów]
Uruchomienie rejestru rmiregistry <port> Polityka bezpieczeństwa Rola serwera HTTP Uruchomienie serwera Uruchomienie klienta Podobnie jak tnameserv w Corbie musi istnieć serwis umożliwiający znajdowanie się obiektów. Każdy serwer działający na określonej maszynie posiada odnośnik do samego siebie w rejestrze działającym na tej samej maszynie. Polityka bezpieczeństwa (począwszy od JDK1.2) określa uprawnienia działających obiektów do takich czynności jak ładowanie (ściąganie plików), tworzenie i podłączanie się do socketów. Dlatego należy określić taki plik. Jeżeli klasy klienta nie mają lokalnego dostępu do pieńków serwera, oraz innych zdefiniowanych jego klas, np. przez CLASSPATH (sytuacja rozproszenia aplikacji w sieci) musi istnieć możliwość dynamicznego transferu. Ponieważ RMI używa protokołu HTTP do transferu klas należy uruchomić dodatkowo serwer HTTP. Dla celów testowania tworzonej aplikacji można użyć serwera dostępnego u Suna, lub określić położenie klas w lokalnym systemie plików. Uruchomienie serwera musi zawierać parametr codebase określający położenie pieńków oraz innych zdefiniowanych przez użytkownika klas, które będą ściągane przez klientów w czasie wykonania. Aby zwiększyć wydajność aplikacji można wszystkie te klasy umieścić w archiwum JAR i w tej postaci rozprowadzać po sieci. Konieczne jest też określenie pliku polityki bezpieczeństwa. Uruchomienie klienta musi zawierać plik polityki bezpieczeństwa, z którego będziemy korzystali podczas pracy z serwerem. Java - zaawansowane możliwości
42
RMI – mechanizm CallBack
Połączenia typu peer-to-peer Klienci muszą być jednocześnie obiektami zdalnymi Komunikacja serwer – klient odbywa się przez referencję Java - zaawansowane możliwości
43
RMI – CORBA CORBA Java / RMI Każdy interfejs dziedziczy z CORBA.Object
Każdy serwer implementuje java.rmi.Remote Obiekty identyfikowane przez referencje Interfejsy identyfikuje nazwa, implementacje przechowywane w repozytorium Interfejsy identyfikuje nazwa, implementacje mapowane na URL w rejestrze Referencja do serwera tworzona przez adapter Referencję do serwera tworzy metoda UnicastRemoteObject. exportObject(this) Używa protokołu IIOP Używa protokołu JRMP Klient uzyskuje referencję do serwera z serwisu nazwowego lub handlowego Klient używa metody lookup() Java - zaawansowane możliwości
44
RMI – CORBA 2 Mapowanie nazw obiektów do implementacji wykonuje repozytorium implementacji Mapowanie nazw do implementacji wykonuje rejestr Informacje o parametrach metod znajdują się w repozytorium interfejsów Informacje o parametrach metod przechowują same obiekty. Dostęp możliwy przez refleksję. Znajdowaniem obiektów zajmuje się ORB Znajdowaniem obiektów zajmuje się Wirtualna Maszyna Javy Podczas wołania metod interfejsy przekazywane są przez referecję, inne obiekty przez wartość Wszystkie interfejsy dziedziczące z Remote przekazywane przez referencję, reszta przez wartość Nie obsługuje garbage collection Garbage collection realizowane przez Wirtualną Maszynę Obsługuje języki oraz platformy, dla których istnieje implementacja CORBA ORB Dostępne wyłącznie dla Wirtualnej Maszyny Javy (w tym produkcji Suna i Microsoftu) Java - zaawansowane możliwości
45
Materiały Strony w sieci web: Bibliografia: www.javasoft.com
Bibliografia: Java tutorial by Sun Enterprise Java Computing – Govind Seshadri Poznaj język Java 2 – Mike Morgan Java - zaawansowane możliwości
Podobne prezentacje
© 2025 SlidePlayer.pl Inc.
All rights reserved.