Σύνοψη 3 ης ιάλεξης. Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων.



Σχετικά έγγραφα
Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων

Σύνοψη 6 ης ιάλεξης. Εισαγωγικά (2)

Σύνοψη 5 ης ιάλεξης. Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων.

Remote Method Invocation (RMI)

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

Διδάσκων: Παναγιώτης Ανδρέου

ικτύωσησε Java Κατανεµηµένα Συστήµατα 08-1

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Αποµακρυσµένη κλήση διαδικασιών

Αντικειµενοστρεφής Προγραµµατισµός

Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων

Απομακρυσμένα αντικείμενα (Remote Objects) Κατανεμημένα Συστήματα 1

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

Αρχιτεκτονική του πληροφοριακού συστήµατος Cardisoft Γραµµατεία 2003 ιαχείριση Προσωπικού

Κατανεμημένα Συστήματα. Ενότητα # 4: Μηχανισμοί Επικοινωνίας Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

2.1 Αντικειµενοστρεφής προγραµµατισµός

Κινητά και Διάχυτα Συστήματα. Ενότητα # 4: Απομακρυσμένα αντικείμενα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Κατανεμημένα Συστήματα με Java. Ενότητα # 16: Κατανεμημένα συστήματα αντικειμένων Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Ειδικά Θέματα Προγραμματισμού

HY335 4ο Φροντιστήριο

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

ιαδικτυακές Εφαρµογές

Κλάσεις και Αντικείµενα

Σύστηµα Java RMI. Κατανεµηµένα Συστήµατα 17-1

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

2η Προγραµµατιστική Εργασία

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

B. Ενσωμάτωση Ιθαγενών Μεθόδων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Αντικειμενοστρεφής Προγραμματισμός

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.

Εισαγωγή στον Κατανεμημένο Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Σχολή Προγραµµατιστών Ηλεκτρονικών Υπολογιστών (ΣΠΗΥ) Τµήµα Προγραµµατιστών Σειρά 112

Εισαγωγή. Κατανεµηµένα Συστήµατα 01-1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

Αντικειμενοστρεφής Προγραμματισμός

ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java

6. Εξαιρέσεις στη γλώσσα Java

Structuring Components Specifications using Dependencies among the Runtime Environments

Βασικά Θέματα Επικοινωνίας. Κατανεμημένα Συστήματα 1

Τη φυσική (MAC) διεύθυνση που δίνει ο κατασκευαστής του δικτυακού υλικού στις συσκευές του (π.χ. στις κάρτες δικτύου). Η περιοχή διευθύνσεων που

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Μοντέλο Σύγχρονου ικτύου. Κατανεµηµένα Συστήµατα Ι Μάθηµα Βασικής Επιλογής, Χειµερινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων

Ανάπτυξη Plugins για το AgentSheets

Επεξεργασία Αρχείων Κειµένου

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Δίκτυα Υπολογιστών Firewalls. Χάρης Μανιφάβας

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο Κατανεµηµένα συστήµατα αρχείων. Μέρη κατανεµηµένου συστήµατος αρχείων

Σύστηµα CORBA. Κατανεµηµένα Συστήµατα 18-1

Κατανεµηµένος Προγραµµατισµός & Προγραµµατισµός στο ιαδίκτυο

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

7.2 Τεχνολογία TCP/IP

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Κατανεμημένα Συστήματα

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ιαχείριση Πληροφοριών στο ιαδίκτυο

Ανάπτυξη και Σχεδίαση Λογισμικού

ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ Α2Α

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Βασικά της γλώσσας JAVA

11β Δομικά πρότυπα σχεδίασης

ΚΕΦΑΛΑΙΟ Web Services

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ΠΑΓΚΑΛΟΣ ΙΩΑΝΝΗΣ ΣΙΣΜΑΝΗΣ ΝΙΚΟΣ. File Transfer Protocol

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Γενικά. Κατανεµηµένα Συστήµατα Ι Μάθηµα Βασικής Επιλογής, Χειµερινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων. Βασικοί Ορισµοί

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Η Βίβλος σχετικά με το JDBC. Περιέχει τρία βασικά tutorials στα οποία θα βασιστεί το μάθημα και περιγράφει όλες τις τάξεις και τις μεθόδους που

Παράλληλη Επεξεργασία

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Αντικειμενοστρεφής Προγραμματισμός

Γενικές Αρχές. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Χαρακτηρισµός Κατανεµηµένων Συστηµάτων

Λογισµικό (Software SW) Γλώσσες

Κατανεµηµένασυστήµατα αρχείων

Κεφάλαιο 1. Νήματα (Threads). Time Sharing

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Φροντιστήριο Α' Κατανεμημένα Συστήματα Επιμέλεια: Μπούτσης Ιωάννης

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

ΤΕΧΝΟΛΟΓΙΑ ΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Το λειτουργικό σύστημα. Προγραμματισμός II 1

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Transcript:

Σύνοψη 3 ης ιάλεξης Κατανεµηµένα Συστήµατα ΙΙ Μάθηµα Ελεύθερης Επιλογής, Εαρινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων Ιωάννης Χατζηγιαννάκης Τετάρτη, 18 Μαρτίου, 2009 Αίθουσα ΑΠ7 Κατανεµηµένα Συστήµατα ΙΙ Επικοινωνία ιεργασιών µέσω TCP/IP Sockets στη JAVA Κλήση Αποµακρυσµένων ιαδικασιών Κατανεµηµένα Αντικείµενα Κατανεµηµένα Αντικείµενα Τεχνολογίες Υλοποίησης Ενδιάµεσα Λογισµικά Remote Method Invocation -- RMI Σύνοψη Μαθήµατος Σύνοψη Μαθήµατος Βιβλιογραφία Επόµενη ιάλεξη Γενικά ίκτυα TCP/IP Μοντέλα Κατανεµηµένων Συστηµάτων Σύνολο Υπολογιστικών Μονάδων Σύνολο ιεργασιών ίκτυο Επικοινωνίας Αποτυπώνουν σε µεγάλο ϐαθµό τις πραγµατικές συνθήκες Υπάρχουν σηµαντικά τεχνικά ϑέµατα που παραλείπονται Ετερογένεια Υλικού: Οι Υπολογιστικές Μονάδες δεν έχουν τα ίδια τεχνικά χαρακτηριστικά Ετερογένεια Λογισµικού: Οι ιεργασίες εκτελούνται σε διαφορετικό Λειτουργικό Σύστηµα Ετερογένεια ικτύου: ιαφορετικές Τεχνολογίες Εστιάζουµε στα κατανεµηµένα συστήµατα όπου το δίκτυο επικοινωνίας υλοποιεί το πρωτόκολλο TCP/IP Μεγάλη οµάδα δικτύων Τοπικά δίκτυα Ethernet Ευρυζωνικά δίκτυα ADSL Ασύρµατα δίκτυα WLAN ιαδίκτυο -- Internet Η αρχιτεκτονική TCP/IP περιγράφει πέντε επίπεδα Οι διαφορετικές τεχνολογίες υλικού κρύβονται από τα χαµηλότερα επίπεδα Οι διαφορετικές τεχνολογίες λογισµικού κρύβονται από τα υψηλότερα επίπεδα

Επικοινωνία ιεργασιών Θεωρητικό Μοντέλο Τύποι Επικοινωνίας (1) Σύγχρονη επικοινωνία Η ανταλλαγή µηνυµάτων µεταξύ των διεργασιών υποστηρίζεται από δύο λειτουργίες: send, receive Ορίζονται σύµφωνα µε τον προορισµό και τον τύπο των µηνυµάτων Η επικοινωνία (ανταλλαγή δεδοµένων) διεξάγετε ως εξής: Μια διεργασία (αποστολέας) στέλνει ένα µήνυµα (ακολουθία bytes) σε κάποιο προορισµό (παραλήπτης) Κάποια άλλη διεργασία στον προορισµό παραλαµβάνει το µήνυµα Οι δύο διεργασίες συγχρονίζονται σε κάθε µήνυµα Η εντολή send ακινητοποιεί την ϱοή εκτέλεσης (blocking operation) έως ότου η αντίστοιχη εντολή receive εκτελεστεί Η εντολή receive ακινητοποιεί την ϱοή εκτέλεσης (blocking operation) έως ότου παραληφθεί ένα µήνυµα Ασύγχρονη επικοινωνία Η εντολή send δεν ακινητοποιεί την ϱοή εκτέλεσης (non-blocking operation). Η ϱοή εκτέλεσης συνεχίζει παράλληλα µε την αποστολή του µηνύµατος Η εντολή receive έχει δύο εκδοχές: 1. blocking receive -- ακινητοποιεί την ϱοή εκτέλεσης (όπως πριν) 2. non-blocking receive -- δεν ακινητοποιεί την ϱοή εκτέλεσης, αν δεν υπάρχει µήνυµα τερµατίζει (επιστρέφοντας null) Τύποι Επικοινωνίας (2) Αξιοπιστία Μεταβατική (Transient) Η πιο συνηθισµένη µορφή επικοινωνίας Υπάρχει η ιδέα της σύνδεσης, όπως στην τηλεφωνία Τα µηνύµατα παραµένουν στο σύστηµα όσο ο αποστολέας και ο παραλήπτης είναι ενεργοί (δηλ. οι διεργασίες εκτελούνται) εν προσφέρει διαχείριση σφαλµάτων Εµµένουσα (Persistent) Τα µηνύµατα παραµένουν στο σύστηµα έως ότου παραδοθούν στον παραλήπτη Ο αποστολέας µπορεί να τερµατίσει µετά την αποστολή µηνυµάτων Ο παραλήπτης λαµβάνει τα µηνύµατα όταν ενεργοποιηθεί Επιβαρύνει τις διεργασίες του συστήµατος Αξιόπιστη παράδοση το σύστηµα προσφέρει εγγύηση παράδοσης µηνυµάτων υπό την παρουσία ενός συγκεκριµένου αριθµού σφαλµάτων (εκ των προτέρων ορισµένο) Αναξιόπιστη παράδοση το σύστηµα δεν προσφέρει καµία εγγύηση παράδοσης µηνυµάτων υπό την παρουσία σφαλµάτων (έστω και µόνο ένα) Εγκυρότητα τα µηνύµατα παραδίδονται αναλλοίωτα (δεν έχει αλλάξει το περιεχόµενο τους) και µία και µόνο µία ϕορά (δεν γίνονται πολλαπλές παραδόσεις) Μερικές εφαρµογές απαιτούν τα µηνύµατα να παραδίδονται µε την ίδια σειρά µε την οποία στάλθηκαν Η παράδοση των µηνυµάτων εκτός σειράς ϑεωρείτε σφάλµα (αποτυχηµένη αποστολή)

Sockets στη JAVA Ο καθιεροµένος τρόπος επικοινωνίας µε µηνύµατα Μπορεί να υλοποιήσει είτε σύγχρονες είτε ασύγχρονες µεταφορές δεδοµένων Είναι η βασικότερη τεχνολογία υλοποίησης Χαµηλότερο επίπεδο από τις υπόλοιπες τεχνολογίες, π.χ. RMI, CORBA Χαρακτηρίζεται ως η assembly του TCP/IP Σε αναλογία µε την assembly -- τα προγράµµατα που ϐασίζονται στα Sockets προσφέρουν καλύτερες επιδόσεις ως προς την ταχύτητα συνδεσης, µετάδοσης, κλπ. Προσφερουν δεν είναι όµως πάντα έτσι Μερικά προγράµµατα σε assembly χρησιµοποιούν όση µνήµη χρειάζεται ένα πρόγραµµα σε άλλη γλώσσα και είναι εξίσου αργά (ή σχεδόν το ίδιο) Με τον ίδιο τρόπο ένα πρόγραµµα που χρησιµοποιεί απέυθίας Sockets µπορεί να έχει τις ίδιες επιδώσεις µε ένα πρόγραµµα RMI Θέµατα Σχεδιασµού µε Sockets Ακόµα και αν δεν είµαστε ϐέβαιοι για τα πλεονεκτήµατα των Sockets -- µπορούµε να εκτιµήσουµε το κόστος Η υλοποίηση µε Sockets είναι σχεδόν πάντα πιό δύσκολη και έχει µεγαλύτερο κόστος σε σχέση µε τις τεχνολογίες υψηλότερου επιπέδου Αν δεν µεταφέρουµε απλά στοιχεία (ASCII) Αν χρειάζεται να αντιµετωπίσουµε πολλά σφάλµατα Αν πρέπει να χρησιµοποιεί πολλαπλούς servers Αν υπάρχουν απαιτήσεις σε ασφάλεια / κρυπτογραφεία Ο κεντρικός στόχος δεν είναι µια αποδοτική υλοποίηση Μπορεί να επιτευχθεί µε την χρήση ισχυρότερων µηχανηµάτων Ο στόχος είναι να καλύψουµε τις προδιαγραφές Βελτίωση στην απόδοση δεν γίνεται ποτέ εκ των προτέρων Η κλάση URL Αν ϑέλουµε να µεταφέρουµε δεδοµένα προς µία κατεύθυνση, µπορούµε να χρησιµοποιήσουµε το προτώκολλο HTTP public URL(String url) throws MalformedURLException URL up = new URL("http://www.upatras.gr/index.html"); boolean equals(object x) -- ελέγχει την ισότητα µεταξύ αντικειµένων URL String gethost() -- επιστρέφει το κοµµάτι που αντιστοιχεί στο host -- www.upatras.gr String getfile() -- επιστρέφει το κοµµάτι που αντιστοιχεί στη σελίδα -- index.html int getport() -- επιστρέφει το κοµµάτι που αντιστοιχεί στην πόρτα/θύρα -- 80 InputStream openstream() -- επιστρέφει µια ϱοή που αντιστοιχεί στη σελίδα Η κλάση InetAddress Αντιπροσωπεύει την διεύθυνση ενός υπολογιστή Χρησιµοποιήτε από τις κλάσεις Socket και DatagramPacket Η κλάση δεν έχει constructor -- προσφέρει 3 static µεθόδους InetAddress getlocalhost() -- η διεύθυνση του τοπικού µηχανήµατος InetAddress getbyname(string host) -- η διεύθυνση του µηχανήµατος host getbyname("www.upatras.gr"); InetAddress [] getallbyname(string host) -- ένα πίνακα µε όλες τις διεύθυνσεις του µηχανήµατος host στην περίπτωση που έχει πολλαπλές συνδέσεις Ολες οι µεθόδοι δηµιουργούν ένα UnknownHostException αν η διεύθυνση δεν είναι σωστή

Η κλάση Socket Η κλάση ServerSocket Μια µονάδα συνδεδεµένη στο ιαδίκτυο έχει ένα σύνολο από local ports -- ένας προορισµός µηνυµάτων στο εσωτερικό της υπολογιστικής µονάδας, ορίζεται από έναν ακέραιο Η κλάση socket συνδέετε σε µία port και προσφέρει µεθόδους για την αποστολή/παραλλαβή µηνυµάτων προς/από την αποµακρυσµένη µονάδα Socket(String host, int port) Socket(InetAddress address, int port) Εφόσον δηµιουργηθεί το αντικείµενο, µε τη µέθοδο getinputstream() δηµιουργούµε ένα αντικείµενο τύπου InputStream Με τη µέθοδο getoutputstream() δηµιουργούµε ένα αντικείµενο τύπου OutputStream Η κλάση Socket υλοποιεί µία local port και προσφέρει µεθόδους για την αποστολή/παραλλαβή µηνυµάτων ServerSocket(int port) Αν η local port είναι δεσµευµένη δηµιουργήται ένα IOException Οταν µια αποµακρύσµένη µονάδα επιχυρίσει να συνδεθεί η local port η µέθοδος accept() δηµιουργεί ένα αντικείµενο Socket Μέσω του νέου αντικειµένου Socket πραγµατοποιείτε η επικοινωνία µε την αποµακρυσµένη µονάδα Επικοινωνία µε Sockets Επεκτείνουµε την συνιστόσα Socket για να µπορούµε να µεταφέρουµε αντικείµενα (SuperSocket) Χρησιµοποιούµε τις συνιστόσες ObjectInputStream και ObjectOutputStream για την σειριοποίηση των αντικειµένων Για την αποφυγή προβληµάτων µε την µεταφορά αντικειµένων µέσω ενός Socket κάνουµε µια ακόµα µετατροπή Χρησιµοποιούµε τις συνιστόσες ByteInputStream και ByteOutputStream για την µετάδοση των (σειριοποιηµένων) αντικειµένων υπο την µορφή ϱεύµατος από byte Συνιστώσα SuperSocket public class SuperSocket { Socket m_sock; DataInputStream m_in; DataOutputStream m_out; public SuperSocket(String host, int port) throws UnknownHostException, IOException { this(new Socket(host, port)); public SuperSocket(Socket s) throws UnknownHostException, IOException { m_sock = s; m_in=new DataInputStream(m_sock.getInputStream()) m_out=new DataOutputStream(m_sock.getOutputStream

Συνιστώσα SuperSocket public void writevector(vector x) throws IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bytes); out.writeobject(x); byte [] buffer = bytes.tobytearray(); out.close(); m_out.writeint(buffer.length); m_out.write(buffer); Συνιστώσα SuperSocket public Vector readvector() throws IOException, ClassNotFoundException { int n = m_in.readint(); byte [] buffer = new byte[n]; theinput.read(buffer); ByteArrayInputStream bytes = new ByteArrayInputStream(buffer); ObjectInputStream in = new ObjectInputStream(bytes); Object x = in.readobject(); in.close(); return (Vector) x; Παράδειγµα Sockets στη JAVA Υλοποιούµε τον εξυπηρέτη µε ένα µόνο νήµα Για να µπορέσουµε να εξυπηρετήσουµε πολλούς χρήστες ταυτόχρονα, η επέκταση είναι σχετικά εύκολη Για κάθε νέα σύνδεση, ο εξυπηρέτης αναθέτει ένα νέο αντικείµενο SuperSocket Τα στοιχεία της αίτησης στέλνονται υπό την µορφή ενός διανύσµατος από αντικείµενα Η µέθοδος processrequest επεξεργάζεται το διάνυσµα για να εξυπηρετήση την αίτηση του πελάτη Η απάντηση του Εξυπηρέτη είναι (επίσης) υπό την µορφή ενός διανύσµατος από αντικείµενα Συνιστώσα Server public class Server { public static final int PORT = 1234; Connection theconnection; ServerSocket thesocket; SuperSocket theclient; public Server() { try { thesocket = new ServerSocket(PORT); while (true) { System.err.println("Server is ready."); Socket s = thesocket.accept(); theclient = new SuperSocket(s); processrequest(); catch (Exception ex) { /*... */

Συνιστώσα Server public void processrequest() { try { Vector v = theclient.readvector(); String opcode = (String) v.elementat(0); Vector out = null; if (opcode.equals("search Flights")) out = searchflights(); else if (opcode.equals("search Seats")) out = searchseats(v); else if (opcode.equals("book Seat")) out = bookseat(v); else System.err.println("Ignored request"); if (out!= null) theclient.writevector(out); theclient.close(); catch (Exception ex) { /*... */ Συνιστώσα Server public Vector searchflights() { Vector out = new Vector(); try { Flight [] flights = Flight.getFlightsFromDB(); for (int i = 0; i < flights.length; i++) { String s = flights[i].packasstring(); out.addelement(s); catch (Exception ex) { /*... */ return out; Συνιστώσα RemoteClient Υλοποιούµε τον πελάτη χρησιµοποιόντας συνιστόσες του SWING Μπορούµε να εµφανίσουµε τα ίδια στοιχεία µε διαφορετικούς τρόπους (thin/thick clients) Υλοποίηση ως Applet Χρήση HTML, Flash,...... Για κάθε αίτηση του χρήστη, ο πελάτης συνδέετε µε τον Εξυπηρέτη και στέλνει ένα διάνυσµα από αντικείµενα που περιγράφουν την αίτηση Ο Πελάτης δεν γνωρίζει πως εκτελείτε η αίτηση public void searchflights() { try { theresults.settext(""); thesocket = new SuperSocket(HOST, PORT); thesocket.getsocket().setsotimeout(timeout); Vector v = new Vector(); v.addelement("search Flights"); thesocket.writevector(v); v = thesocket.readvector(); thesocket.close(); for (int i = 0; i < v.size(); i++) { String s = (String) v.elementat(i); theresults.append(s + "\n"); catch (Exception ex) { /*... */

Κλήση Αποµακρυσµένων ιαδικασιών RPC (1) Κλήση Αποµακρυσµένων ιαδικασιών RPC (2) Ακολουθεί το σχήµα επικοινωνίας Request-Reply Μοντέλο Πελάτη - Εξυπηρέτη Ειδικά προσαρµοσµένο και ενσωµατωµένο στο επίπεδο της γλώσσας προγραµµατισµού Ο προγραµµατιστής χειρίζεται την αποµακρυσµένη κλήση ως µια απλή κλήση µιας τοπικής διαδικασίας εν εµπλέκεται σε ϑέµατα αίτησης/απάντησης Με µεγάλη ευκολία µια τοπική διαδικασία µπορεί να µετατραπεί σε αποµακρυσµένη ιαφάνεια πρόσβασης Ευκολία χρήσης Γρήγορη ανάπτυξη εφαρµογών Λιγότερα λάθη Κατά την µεταγλώττιση του προγράµµατος, εισάγεται µια σειρά λειτουργιών που υλοποιούν την υποκείµενη επικοινωνία Το Ενδιάµεσο Λογισµικό Επικοινωνίας ενσωµατώνεται στην εφαρµογή RPC Runtime -- Το ενδιάµεσο λογισµικό που υλοποιεί το πρωτόκολλο request-reply ως προς την ανταλλαγή αιτήσεων και απαντήσεων Client Stub -- Το ενδιάµεσο επίπεδο σύνδεσης του κώδικα της διεργασίας του πελάτη µε το RPC Runtime ηµιουργεί τις αιτήσεις σύµφωνα µε τις παραµέτρους της κλήσης της διαδικασίας αποστολή µέσω δικτύου Επεξεργάζεται τις απαντήσεις του εξυπηρέτη και επιστέφει τις αντίστοιχες µεταβλητές παραλαβή µέσω δικτύου Κλήση Αποµακρυσµένων ιαδικασιών RPC (3) Παράδειγµα Αποµακρυσµένης Κλήσης ιαδικασίας Server Stub -- Το ενδιάµεσο επίπεδο σύνδεσης του κώδικα της διεργασίας του εξυπηρέτη µε το RPC Runtime Επεξεργάζεται την αίτηση και καλεί την διαδικασία µε τις δοσµένες παραµέτρους παραλαβή µέσω δικτύου ηµιουργεί τις απαντήσεις σύµφωνα µε τις τιµές που επιστρέφει η διαδικασία αποστολή µέσω δικτύου Το RPC Runtime προσφέρεται από την γλώσσα προγραµµατισµού Τα Client και Server Stubs παράγονται αυτόµατα µέσω ειδικών εργαλείων (stub generators) µε ϐάση τον κώδικα των διεργασιών πελάτη - εξυπηρέτη Η αποµακρυσµένη κλήση υλοποιείτε µε 2 κλήσεις: Μια κλήση στο Client Stub Μια κλήση στο Server Stub 1. (Πελάτης) Τοπική Κλήση 2. (Client Stub) Πακετάρισµα παραµέτρων 3. (Λειτουργικό) Αποστολή αίτησης 4. (Λειτουργικό) Παραλαβή αίτησης 5. (Server Stub) Ξεπακετάρισµα 6. (Εξυπηρέτης) Εκτέλεση διαδικασίας 7. (Server Stub) Πακετάρισµα απάντησης 8. (Λειτουργικό) Αποστολή απάντησης 9. (Λειτουργικό) Παραλαβή απάντησης 10. (Client Stub) Ξεπακετάρισµα 11. (Πελάτης) Επιστροφή από Κλήση Ροή Εκτέλεσης

Υποστήριξη ιαφορετικών Γλωσσών (1) Υποστήριξη ιαφορετικών Γλωσσών (2) υνατότητα χρήσης διαφορετικής γλώσσας προγραµµατισµού για την διεργασία πελάτη και την διεργασία εξυπηρέτη Ετερογένεια υλικού εν υπάρχει κοινή γλώσσα (π.χ. διεργασία πελάτη είναι ενσωµατωµένη σε συσκευή περιορισµένων δυνατοτήτων) Σχεδιαστικοί λόγοι Χρήση διαφορετικής γλώσσας για το επίπεδο της διεπαφής µε τον χρήστη (διεργασία πελάτη) και το επίπεδο της επεξεργασίας (διεργασία εξυπηρέτη) Γλώσσα Ορισµού ιεπαφών IDL Τυποποιηµένη περιγραφή των παραµέτρων των διαδικασιών Ανεξάρτητη από την γλώσσα προγραµµατισµού Ανεξάρτητη από το λειτουργικό σύστηµα / υλικό Οι γλώσσες προγραµµατισµού υποστηρίζουν την IDL προσφέροντας προσαρµοστές (adapters) µέσω των οποίων κατασκευάζονται τα client και server stubs που συνδέουν τον υπόλοιπο κώδικα µε τον ενδιάµεσο λογισµικό επικοινωνίας Κατά την εκτέλεση του κώδικα IDL παράγεται ο κώδικας για την γλώσσα προγραµµατισµού που επιθυµούµε να χρησιµοποιήσουµε Ο κώδικας της διεργασίας (πελάτη ή εξυπηρέτη) αφού µεταγλωττιστεί, συνδέεται (linking) µε τα client και server stubs που δηµιούργησε η IDL Η IDL υποστηρίζεται από όλα τα διαδεδοµένα λειτουργικά συστήµατα Sun XDR -- για το SunOS DCE IDL -- για SunOS, Windows, Linux, Mac,... ιευθέτηση Παραµέτρων -- Marshaling (1) Η µεταφορά των παραµέτρων κλήσης µιας διαδικασίας είναι απλή όταν πρόκειται για έναν ακέραιο για ένα string? Πως µεταφέρονται σύνθετοι τύποι µεταβλητών; πίνακας, λίστα, διάνυσµα,... Ακόµα και για του ακέραιους δεν είναι ξεκάθαρο 1. Pentium -- αποστολή {5, JILL 2. SPARC -- διαβάζει λάθος ακέραιο και σωστό string 3. SPARC -- µε αντιστροφή bytes διαβάζει σωστό ακέραιο αλλά ανάποδο string ιευθέτηση Παραµέτρων -- Marshaling (2) Οι διαφορετικές αρχιτεκτονικές χειρίζονται διαφορετικά τις µεταβλητές Κατά την µεταφορά πρέπει να υπάρχει ενηµέρωση για τον τύπο της µεταβλητής Συµφωνία για την µορφή των τύπων µεταβλητών Παρόµοιος τρόπος µε Java Serialization εν µπορούµε να µεταφέρουµε δείκτες Ολες οι µεταβλητές µεταφέρονται κατά τιµή (by value)

Κατανεµηµένο Περιβάλλον Επεξεργασίας DCE Παράδειγµα Χρήσης DCE Παράδειγµα Χρήσης DCE Υλοποίηση του Συστήµατος Αποµακρυσµένης Κλήσης ιαδικασίας Αρχικά σχεδιάστηκε για κατανεµηµένα συστήµατα ϐασισµένα στο Unix Πλέον υποστηρίζει διαφορετικά λειτουργικά συστήµατα: Unix, Windows, Mac,... Χρησιµοποιεί ένα κλασικό µοντέλο πελάτη-εξυπηρέτη οι διαθέσιµες υπηρεσίες παρέχονται είτε από το ίδιο το DCE είτε από ξεχωριστές εφαρµογές Υποστηρίζει εγγυήσεις at-most-once και at-least-once Ανοιχτός ικτυακός Υπολογισµός ONC Παράδειγµα Χρήσης ONC (1) Παράδειγµα Χρήσης ONC Υλοποίηση του Συστήµατος Αποµακρυσµένης Κλήσης ιαδικασίας Σχεδιάστηκε για το Sun OS Γνωστό και ως Sun RPC Αντικαταστήθηκε από το DCE που είναι συµβατό και µε άλλα λειτουργικά Απλός τρόπος χρήσης ενδιάµεσο λογισµικό Οι λειτουργίες RPC υλοποιούνται ως ξεχωριστή ϐιβλιοθήκη

Παράδειγµα Χρήσης ONC (2) demo.x #in struct add3_params{ int i, j, k; ; program DEMO { version DEMOVERS1 { int ADD3(add3_params) = 1; int MYABS(int) = 2; = 1; = 0x2000009c; Παράδειγµα Χρήσης ONC (3) demo.h #include <rpc/rpc.h> struct add3_params{ int i, j, k; ; typedef struct add3_params add3_params; #define DEMO ((unsigned long)(0x2000009c)) #define DEMOVERS1 ((unsigned long)(1)) #define ADD3 ((unsigned long)(1)) extern int * add3_1(); #define MYABS ((unsigned long)(2)) extern int * myabs_1(); extern int demo_1_freeresult(); extern bool_t xdr_add3_params(); Παράδειγµα Χρήσης ONC (4) demo_funcs.x #include "demo.h" int *add3_1(add3_params *in) { static int result; result = in->i + in->j + in->k; return &result; int *myabs_1(int *in) { static int result; result = (*in < 0)? -*in : *in; return &result; Παράδειγµα Χρήσης ONC (5) demo_main.x (1) #include <stdio.h> #include "demo.h" main(int argc, char *argv[]) { CLIENT *cl; int abs_arg *result1, *result2; add3_params add3_arg; if ((cl = clnt_create("10.0.0.1", DEMO, DEMOVERS1 "tcp")) == NULL) { clnt_pcreateerror("10.0.0.1"); exit(1);

Παράδειγµα Χρήσης ONC (6) Παράδειγµα Χρήσης ONC (7) demo_main.x (2) demo_main.x (3) add3_arg.i = argv[1]; add3_arg.j = argv[2]; add3_arg.k = argv[3]; result1 = add3_1(&add3_arg, cl); if (result == null) { clnt_perror(cl, "10.0.0.1"); exit(2); printf("sum is %d\n", *result1); result2 = myabs_1(*result1, cl); if (result == null) { clnt_perror(cl, "10.0.0.1"); exit(3); printf("abs value is %d\n", *result2); xdr_free(xdr_int, result1); xdr_free(xdr_int, result2); ιαφάνεια Πρόσβασης (1) ιαφάνεια Πρόσβασης (2) Η υπολογιστική µονάδα όπου εκτελείτε η διεργασία του εξυπηρέτη δεν έχει σταθερή διεύθυνση στο δίκτυο (IP address) ή δεν είναι εκ των προτέρων γνωστή Binding -- Ο πελάτης πρέπει να εντοπίσει και να συνδεθεί µε τον εξυπηρέτη δυναµικά κατά την διάρκεια της εκτέλεσης Η υλοποίηση της διαδικασίας εντοπισµού και σύνδεσης συνήθως γίνεται µε την χρήση µιας υπηρεσίας καταλόγου εναλλακτικά µπορεί να υλοποιηθεί κάποια µέθοδος ανακάλυψης / εντοπισµού Η υπηρεσία εντοπισµού δεν είναι κρυµµένη από το ενδιάµεσο λογισµικό επικοινωνίας π.χ. χρησιµοποιούνται ειδικές κλήσεις µέσω των οποίων γίνεται το binding εν επιτυγχάνεται πλήρης διαφάνεια τοποθεσίας και πρόσβασης σε επίπεδο εφαρµογής Σε επίπεδο προγραµµατισµού δεν µπορούµε να περάσουµε ως παράµετρο έναν δείκτη σε µία ϑέση µνήµης Μια αποµακρυσµένη κλήση µπορεί να αποτύχει λόγω παρουσίας σφαλµάτων στην επικοινωνία, στον εξυπηρέτη, σφάλµατος binding, κλπ. Είναι απαραίτητο να οριστούν κατάλληλες συµβάσεις για την επιστροφή κωδικών σφάλµατος Ερχεται σε αντίθεση µε την επιθυµία να υπάρχει διαφάνεια πρόσβασης Μια αποµακρυσµένη κλήση διαδικασίας µοιάζει µε τοπική κλήση δεν είναι όµως ακριβώς ίδια

ιαφάνεια Πρόσβασης (3) Απόδοση Παράδειγµα Εντοπισµού Εξυπηρέτη στο DCE Η κλήση µιας τοπικής, κενής, διαδικασίας (null invocation) χωρίς παραµέτρους: Λιγότερο από 1µs Η κλήση µιας αποµακρυσµένης, κενής, διαδικασίας (null invocation) χωρίς παραµέτρους, µεταξύ δύο υπολογιστών που είναι συνδεδεµένοι από ένα δίκτυο: Για απ ευθείας σύνδεση των υπολογιστών µε την χρήση Ethernet 100 Mbps -- 1ms 10k ϕορές περισσότερο! Καθυστέρηση προκύπτει και από το ενδιάµεσο λογισµικό επικοινωνίας (π.χ. πακετάρισµα, δηµιουργία αίτησης, κλπ.) Καθυστέρηση προκύπτει και από το λειτουργικό σύστηµα (π.χ. πρωτόκολλα µεταφοράς, αντιγραφή παραµέτρων, κλπ.) Σύνοψη 3 ης ιάλεξης Εισαγωγικά (1) Κατανεµηµένα Συστήµατα ΙΙ Επικοινωνία ιεργασιών µέσω TCP/IP Sockets στη JAVA Κλήση Αποµακρυσµένων ιαδικασιών Κατανεµηµένα Αντικείµενα Κατανεµηµένα Αντικείµενα Τεχνολογίες Υλοποίησης Ενδιάµεσα Λογισµικά Remote Method Invocation -- RMI Σύνοψη Μαθήµατος Σύνοψη Μαθήµατος Βιβλιογραφία Επόµενη ιάλεξη Ενα αντικείµενο χαρακτηρίζεται κατανεµηµένο όταν οι µέθοδοι του µπορούν να κληθούν εξ αποστάσεως παρόµοιο τρόπο µε την κλήση αποµακρυσµένων διαδικασιών Σε τοπικό επίπεδο, οι δείκτες στο κατανεµηµένο αντικείµενο απεικονίζονται τοπικά από ένα ειδικό, εξουσιοδοτηµένο αντικείµενο από το οποίο γίνονται οι κλήσεις (proxy/stub) Μια αναφορά σε ένα κατανεµηµένο αντικείµενο µπορεί να χρησιµοποιηθεί ως παράµετρος στην κλήση µιας αποµακρυσµένης διαδικασίας Ο εξυπηρέτης ϑα δηµιουργήσει ένα τοπικό, εξουσιοδοτηµένο αντικείµενο (proxy) σύµφωνα µε τον δείκτη στο κατανεµηµένο αντικείµενο

Εισαγωγικά (2) Για κάθε αντικείµενο υπάρχει ένα αντικείµενο σκελετού (skeleton object) Για κάθε αποµακρυσµένη αναφορά υπάρχει ένα αντικείµενο εξουσιοδότης (proxy object) Το αντικείµενο εξουσιοδότης αντιστοιχεί στο client stub Το αντικείµενο σκελετού αντιστοιχεί στο server stub Η χρήση των µεθόδων του κατανεµειµένου αντικείµενου γίνεται µέσω του RM runtime Εξουσιοδοτηµένο αντικείµενο Κλήση διαδικασίας Κύκλος Ζωής Κατανεµηµένων Αντικειµένων Ενα κατανεµηµένο αντικείµενο δηµιουργείτε από την κλάση που το ορίζει µε την πρώτη αναφορά ίδιος τρόπος µε τα απλά, τοπικά, αντικείµενα Η µονάδα που δηµιούργησε το αντικείµενο είναι υπεύθυνη για την διαχείριση του Κάθε αποµακρυσµένη διεργασία που επιθυµεί να χρησιµοποιήσει το αντικείµενο, πρέπει να επικοινωνήσει µε την µονάδα που το δηµιούργησε (διαχειριστή) Η µονάδα διαχειριστής κρατάει δείκτες προς τις διεργασίες που έχουν Ϲητήσει πρόσβαση στο κατανεµηµένο αντικείµενο Ορισµένοι µηχανισµοί περισυλλογής άχρηστων αντικείµενων (Garbage Collection) ακολουθούν την ίδια τακτική Οταν ένα αντικείµενο δεν έχει κανένα δείκτη προς κάποια διεργασία, ϑεωρείτε άχρηστο και περισυλλέγεται ηµιουργία, Καταχώρηση, Αναζήτηση Αποµάκρυνση Αντικειµένων Μία διεργασία εξυπηρέτης δηµιουργεί το πρώτο αντικείµενο σύµφωνα µε την κλάση που το ορίζει Καταχωρεί τα στοιχεία του αντικειµένου (και της κλάσης που το ορίζει) σε µια υπηρεσία καταλόγου σύµφωνα µε ένα όνοµα Οταν µια διεργασία πελάτης ϑελήσει να χρησιµοποιήσει το κατανεµηµένο αντικείµενο, το αναζητά µέσω της υπηρεσίας καταλόγου µε ϐάση το όνοµα Η αναζήτηση επιστρέφει πληροφορίες για την τοποθεσία της κλάσης του αντικειµένου, την ύπαρξη ή όχι αντικειµένου Ενα αντικείµενο µπορεί να µην χρησιµοποιηθεί για µεγάλο χρονικό διάστηµα για λόγους εξοικονόµησης πόρων, το σύστηµα αποµακρύνει τα ανενεργά αντικείµενα σε δευτερεύουσα µονάδα αποθήκευσης Οταν µια διεργασία χρησιµοποιήσει τον τοπικό εξουσιοδότη (proxy) το σύστηµα επαναφέρει το αντικείµενο στην πρωτεύουσα µονάδα αποθήκευσης (επαναφορά) Η αποµάκρυνση και επαναφορά αντιστοιχεί στην λογική διαχείρισης σελίδων εικονικής µνήµης

Περισυλλογή Αντικειµένων Το σύστηµα (εξυπηρέτης) που δηµιούργησε το κατανεµηµένο αντικείµενο A, διατηρεί ένα διάνυσµα A.v Οταν µια διεργασία p (πελάτης) δηµιουργήσει έναν τοπικό εξουσιοδότη (proxy) για το κατανεµηµένο αντικείµενο Το σύστηµα εξυπηρέτης προσθέτει την p στο A.v Οταν µια διεργασία p (πελάτης) περισυλλέξει τον τοπικό εξουσιοδότη (proxy) -- δεν υπάρχει καµία (τοπική) αναφορά Το σύστηµα εξυπηρέτης αφαιρεί την p από το A.v Αν ένα αντικείµενο έχει κενό διάνυσµα για ορισµένο χρονικό διάστηµα το σύστηµα ϑεωρεί ότι δεν χρησιµοποιείτε: το αντικείµενο περισυλλέγεται

Τεχνολογίες Java RMI Αυστηρά για Java Ο κώδικας proxy µπορεί να δηµιουργηθεί εκ των προτέρων για τους πελάτες DCOM / COM+ Corba Υποστηρίζει διαφορετικές γλώσσες Απευθύνεται στα Windows* Υποστηρίζει διαφορετικές γλώσσες Υλοποιείται σε όλα τα λειτουργικά Πλούσια λειτουργικότητα ιαφορετικοί στόχοι διαφορετικές τεχνικές ανάπτυξης Υλοποίηση Κατανεµηµένων Αντικείµενων (1) Η κλάση που περιγράφει ένα κατανεµηµένο αντικείµενο υλοποιεί µία διεπαφή (interface Remote) ή/και επεκτείνει µια ϐασική κλάση (class RemoteObject) Η επέκταση της διεπαφής και ϐασικής κλάσης επιτρέπει στο σύστηµα εκτέλεσης να ανακαλύψει δυναµικά αν το συγκεκριµένο αντικείµενο είναι τοπικό ή κατανεµηµένο Η γλώσσα προγραµµατισµού δηµιουργεί αυτόµατα την κλάση εξουσιοδότη και την κλάση σκελετό Παρόµοιος τρόπος µε IDL Οι κλάσεις εξουσιοδότη και σκελετού αποθηκεύονται σε κάποιο διακοµιστή αρχείων για να είναι προσβάσιµα από τις αποµακρυσµένα µονάδες µέσω δικτύου Υλοποίηση Κατανεµηµένων Αντικείµενων (2) Παράδειγµα Υλοποίησης

Η υλοποίηση µε RMI είναι σχεδόν πάντα πιο εύκολη και έχει µικρότερο κόστος σε σχέση µε κάποια υλοποίηση σε Sockets Η µετατροπή των δεδοµένων (προς µεταφορά) γίνεται εξολοκλήρου µε την χρήση της RMI Αν δεν µεταφέρουµε απλά στοιχεία (ASCII) µειώνουµε αρκετά τον απαραίτητο κώδικα Μπορούµε να επικοινωνήσουµε µε µεγαλύτερη ευκολία όταν παρεµβάλλονται firewalls -- η σύνδεση µπορεί να γίνει µέσω πρωτοκόλλου http Η µεταφορά λειτουργιών από τον πελάτη στον εξυπηρέτη είναι πολύ πιο εύκολη Ο κεντρικός στόχος δεν είναι µια αποδοτική υλοποίηση Η υλοποίηση µε RMI είναι ορισµένα αρνητικά στοιχεία Η χρήση του JAVA Serialization απαιτεί µνήµη (δηµιουργία νέων προσωρινών αντικειµένων) και επεξεργαστική ισχύ (µετατροπή δεδοµένων) Η τεχνολογία RMI ανήκει στην SUN -- η εξέλιξη της, η ϐελτίωση των υπάρχοντων λειτουργιών, η υποστήριξη εξαρτάται από την SUN Είναι αποκλειστικά για JAVA -- υπάρχουν τρόποι να ξεπεραστεί το πρόβληµα µε την χρήση της ϐιβλιοθήκης JNI Παρ ολα αυτά είναι πιο απλή από την CORBA Συντοµότερος χρόνος υλοποίησης Μπορεί να επιτευχθεί µε την χρήση ισχυρότερων µηχανηµάτων Βελτίωση στην απόδοση δεν γίνεται ποτέ εκ των προτέρων Απλό παράδειγµα χρήσης RMI Το αντικείµενο ϐρίσκετε στο µηχάνηµα URL addr = new URL("rmi://www.upatras.gr/ds2course"); Βασιζόµαστε στο πρωτόκολλο rmi και όχι στο http Απευθυνόµαστε στον κατάλογο της RMI (registry) του τοπικού µηχανήµατος Server server = (Server) Naming.lookup(addr); Η µέθοδος µας επιστρέφει µια αναφορά στο αντικείµενο που αναζητούµε, µε συγκεκριµένο τύπο στο παράδειγµα το αντικείµενο είναι τύπου Server Μόλις ϐρεθεί µια αναφορά, χρησιµοποιούµε το αντικείµενο σαν να ήταν ένα κανονικό τοπικό αντικείµενο float mark = server.getmymark(am); Μοναδική διαφορά η µέθοδος getmymark() µπορεί να δηµιουργήσει ένα σφάλµα τύπου RemoteException Παράδειγµα RMI 1 Υλοποιούµε τρεις συναλλαγές µεταξύ Πελάτη-Εξυπηρέτη (δύο υψηλότερα επίπεδα) Αναζήτηση Πτήσεων επιστρέφει όλες τις πτήσεις που υπάρχουν στη ϐάση δεδοµένων Αναζήτηση Θέσεων επιστρέφει όλες τις κρατήσεις που αφορούν ένα συγκεκριµένο πελάτη Κράτηση ϑέσης υποθέτουµε ότι η πτήση και ο πελάτης υπάρχουν ήδη στους πίνακες της ϐάσης δεδοµένων (για χάριν ευκολίας)

Οι συνιστώσες λογισµικού για την υλοποίηση σε RMI δεν είναι πολύ διαφορετικές από αυτές που χρησιµοποιούν Sockets Η ϐασική διαφορά είναι η απουσία των µεθόδων που προετοιµάζουν τα δεδοµένα για αποστολή δηλ. η συνιστώσα SuperSocket Το πρώτο ϐασικό ϐήµα είναι να καταχωρίσουµε στην RMI τις µεθόδους που ϑα προσφέρει ο εξυπηρέτης Βασιζόµαστε στο interface της RMI Remote Το επεκτείνουµε ορίζοντας το ServerInterface Ολες οι µέθοδοι του interface µπορεί να δηµιουργήσουν ένα σφάλµα τύπου RemoteException import java.rmi.*; import java.sql.sqlexception; public interface ServerInterface extends Remote { public Flight [] searchflights() throws RemoteException, SQLException ; public Reservation [] searchseats( String passenger_no) throws RemoteException, SQLException ; public void bookseat(string flight_no, String passenger_no, String res_no) throws RemoteException, SQLException, FlightBookedException ; Οι δύο πρώτες µέθοδοι επιστρέφουν ένα πίνακα στην Java οι πίνακες είναι αντικείµενα τα οποία µπορούν να σειριοποιηθούν Η συνιστώσα Server επεκτείνει την UnicastRemoteObject Εποµένως η RMI ϑα περάσει τις τιµές των αντικειµένων και όχι αναφορές σε αυτά Αν πολλοί πελάτες Ϲητήσουν το ίδιο αντικείµενο Flight ϑα πάρουν διαφορετικά αντίγραφα αντί για µια αναφορά στο ίδιο αντικείµενο Αν για κάποιο λόγο ϑέλουµε να περάσουµε αναφορές σε ένα αντικείµενο µπορούµε να χρησιµοποιήσουµε την µέθοδο exportobject που ορίζει η συνιστώσα UnicastRemoteObject import java.rmi.*; import java.rmi.server.*; import java.sql.*; public class Server extends UnicastRemoteObject implements ServerInterface { static final String SERVERNAME = "ARServer"; static final String DB = "jdbc:odbc:airline"; static final String USER = ""; static final String PASSWORD = ""; Connection theconnection; public Server() throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); theconnection = DriverManager.getConnection(DB, USER, PASSWORD)

public static void main(string [] args) { System.setSecurityManager(new RMISecurityManager()); try { Server server = new Server(); Naming.rebind(SERVERNAME, server); System.out.println("Server ready."); catch (Exception ex) { ex.printstacktrace(); public Flight [] searchflights() throws RemoteException, SQLException { Flight [] flights = Flight.getFlights(theConnection); return flights; public Reservation [] searchseats(string passenger_no throws RemoteException, SQLException { Reservation [] res = Reservation.getPassenger( theconnection, passenger_no); return res; public void bookseat(string flight_no, String passenger_no, String res_no) throws RemoteException, SQLException, FlightBookedException { Reservation res = new Reservation( theconnection, res_no, flight_no,passenger_no); res.dbwrite(theconnection); Εκτέλεση RMI Server ηµιουργήστε ένα ϕάκελο και τοποθετήστε όλα τον κώδικα της υλοποίησης και την ϐάση δεδοµένων (airline.mdb) Ρυθµίστε τον οδηγό ODBC Κάντε compile τον κώδικα: javac *.java ηλώστε την συνιστώσα Server στον τοπικό κατάλογο της RMI: rmic Server Ξεκινήστε τον τοπικό κατάλογο της RMI: start rmiregistry Ξεκινήστε τον Εξυπηρέτη: java Server Υλοποιούµε τον πελάτη χρησιµοποιώντας συνιστώσες του SWING Μπορούµε να εµφανίσουµε τα ίδια στοιχεία µε διαφορετικούς τρόπους (thin/thick clients) Υλοποίηση ως ανεξάρτητη εφαρµογή Υλοποίηση ως Applet Χρήση HTML, Flash,...... Ο Πελάτης δεν γνωρίζει πως εκτελείτε η αίτηση Η υλοποίηση του επιπέδου µε RMI είναι (σαφώς) ποιο απλή από την αντίστοιχη που χρησιµοποιεί Sockets

import java.rmi.*; import java.awt.*; import java.awt.event.*; public class RemoteClient extends Frame { public static final String URL = "rmi://127.0.0.1/arserver"; ServerInterface theserver; Button thesearchflights = new Button("Search Flights");... TextField theflightno = new TextField();... TextArea theresults = new TextArea(); public static void main(string [] args) { new RemoteClient(); public RemoteClient() { super("airline Reservation System (Remote Client)... setsize(600, 400); setvisible(true); try { theserver = (ServerInterface) Naming.lookup(URL); catch (Exception ex) { ex.printstacktrace(); public void searchflights() throws Exception { theresults.settext(""); Flight [] flights = theserver.searchflights(); for (int i = 0; i < flights.length; i++) { theresults.append(flights[i] + "\n"); public void searchseats() throws Exception { theresults.settext(""); Reservation [] seats = theserver.searchseats(thepassengerno.gettext()); for (int i = 0; i < seats.length; i++) { theresults.append(seats[i] + "\n"); public void bookseat() throws Exception { theresults.settext(""); theserver.bookseat(theflightno.gettext(), thepassengerno.gettext(), thereservationno.gettext()); public void actionperformed(actionevent evt) { try { String cmd = evt.getactioncommand(); if (cmd.equals("search Flights")) searchflights(); else if (cmd.equals("search Seats")) searchseats(); else if (cmd.equals("book Seat")) bookseat(); catch (Exception ex) { ex.printstacktrace();

Εκτέλεση RMI Client Παράδειγµα RMI 2 package compute; Εφόσον ο server τρέχει Ξεκινήστε τον Πελάτη: java RemoteClient import java.rmi.remote; import java.rmi.remoteexception; public interface Compute extends Remote { <T> T executetask(task<t> t) throws RemoteException; public interface Task<T> { T execute(); package engine; public class ComputeEngine implements Compute { public ComputeEngine() { super(); public <T> T executetask(task<t> t) { return t.execute();... public static void main(string[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); try { String name = "Compute"; Compute engine = new ComputeEngine(); Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0); Registry registry = LocateRegistry.getRegistry(); registry.rebind(name, stub); System.out.println("ComputeEngine bound"); catch (Exception e) { System.err.println("ComputeEngine exception:"); e.printstacktrace();

package client; public class ComputePi { public static void main(string args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); try { String name = "Compute"; Registry reg = LocateRegistry.getRegistry(args[0]); Compute comp = (Compute) reg.lookup(name); Pi task = new Pi(Integer.parseInt(args[1])); BigDecimal pi = comp.executetask(task); System.out.println(pi); catch (Exception e) { System.err.println("ComputePi exception:"); e.printstacktrace(); package client; public class Pi implements Task<BigDecimal>, Serializable private static final long serialversionuid = 227L; /** constants used in pi computation */ private static final BigDecimal FOUR = BigDecimal.valueOf(4); /** rounding mode to use during pi computation */ private static final int roundingmode = BigDecimal.ROUND_HALF_EVEN; /** digits of precision after the decimal point */ private final int digits; /** * Construct a task to calculate pi to * the specified precision. */ public Pi(int digits) { this.digits = digits; /** * Calculate pi. */ public BigDecimal execute() { return computepi(digits); /** * Compute the value of pi to the specified number of * digits after the decimal point. The value is * computed using Machin s formula: * * pi/4 = 4*arctan(1/5) - arctan(1/239) * * and a power series expansion of arctan(x) to * sufficient precision. */ public static BigDecimal computepi(int digits) {...

/** * Compute the value, in radians, of the arctangent of * the inverse of the supplied integer to the specified * number of digits after the decimal point. The value * is computed using the power series expansion for the * arc tangent: * * arctan(x) = x - (xˆ3)/3 + (xˆ5)/5 - (xˆ7)/7 + * (xˆ9)/9... */ public static BigDecimal arctan(int inversex, int scale) {... > mkdir /public_html/classes > javac compute/compute.java compute/task.java > jar cvf compute.jar compute/*.class added manifest adding: compute/compute.class(in = 307) (out= 201)(deflat adding: compute/task.class(in = 217) (out= 149)(deflated > javac -cp /public_html/classes/compute.jar engine/computeengine.java > mkdir /public_html/classes/client > javac -cp /public_html/classes/compute.jar client/computepi.java client/pi.java > rmiregistry & > java -cp /src:/ /public_html/classes/compute.jar -Djava.rmi.server.codebase= http://zaphod/ beeblebrox/classes/compute.jar -Djava.rmi.server.hostname=zaphod -Djava.security.policy=server.policy engine.computeengine java -cp /src: /public_html/classes/compute.jar -Djava.rmi.server.codebase= http://ford/ perfect/classes/ -Djava.security.policy=client.policy client.computepi zaphod 45

Server Policy grant codebase "file:/home/beeblebrox/src/" { permission java.security.allpermission; ; Client Policy grant codebase "file:/home/perfect/src/" { permission java.security.allpermission; ; Σύνοψη 3 ης ιάλεξης Σύνοψη ιάλεξης Κατανεµηµένα Συστήµατα ΙΙ Επικοινωνία ιεργασιών µέσω TCP/IP Sockets στη JAVA Κλήση Αποµακρυσµένων ιαδικασιών Κατανεµηµένα Αντικείµενα Κατανεµηµένα Αντικείµενα Τεχνολογίες Υλοποίησης Ενδιάµεσα Λογισµικά Remote Method Invocation -- RMI Σύνοψη Μαθήµατος Σύνοψη Μαθήµατος Βιβλιογραφία Επόµενη ιάλεξη Επικοινωνία ιεργασιών µέσω TCP/IP Τύποι Επικοινωνίας Sockets σε JAVA Sockets Κατανεµηµένα Αντικείµενα Θέµατα Σχεδιασµού JAVA RMI

Βιβλιογραφία Tutorials Βιβλίο Distributed Systems, Concepts and Design" (G.Coulouris, J.Dollimore, T.Kindberg) 1. Κεφάλαιο 4: Interprocess Communication 2. Κεφάλαιο 5: Distributed Objects and Remote Invocation Βιβλίο Distributed Systems: Principles and Paradigms" (A.Tanenbaum, M.Steen) 1. Κεφάλαιο 2: Communication -- Μόνο 2.1, 2.2, 2.3 Βιβλίο Κατανεµηµένα Συστήµατα µε Java (Ι.Κ.Κάβουρας, Ι.Ζ.Μήλης, Γ.Β.Ξυλωµένος, Α.Α.Ρουκουνάκη) 1. Κεφάλαιο 7: Επικοινωνία µέσω δικτύου 2. Κεφάλαιο 8: ικτύωση στην Java 3. Κεφάλαιο 16: Κατανεµηµένα αντικείµενα Trail: Custom Networking http://java.sun.com/docs/books/tutorial/ networking/index.html Trail: Custom Networking http://java.sun.com/docs/books/tutorial/rmi/ index.html Επόµενη ιάλεξη SUN SPOT