Τρίτη 15 Φεβρουαρίου 2011

Screenshot εφαρμογής

Παρακάτω παρατίθεται ένα screenshot της εφαρμογής κατά τη λειτουργία της:



Στη συγκεκριμένη εικόνα φαίνεται η τοποθέτηση κόμβων στον πίνακα δρομολόγησης του bootstrap κόμβου.

Παρασκευή 11 Φεβρουαρίου 2011

Περιγραφή υλοποίησης εφαρμογής

Η εφαρμογή διαχωρίστηκε σε πακέτα (packages) κλάσεων, με σκοπό τη διάκριση των διαφόρων λειτουργιών. Αναλυτικά, απαρίζεται από τα ακόλουθα πακέτα:
·          
      Utility
Τo συγκεκριμένο πακέτο περιλαμβάνει μια κλάση, ονόματι Utility, σκοπός της οποίας είναι η δημιουργία των αναγνωριστικών των κόμβων και των αναγνωριστικών των αρχείων με τη χρήση της συνάρτησης SHA-1.

·         Structures
To πακέτο Structures περιλαμβάνει κλάσεις, οι οποίες αναπαριστούν τα βασικά συστατικά κομμάτια για τη λειτουργία του Pastry. Συγκεκριμένα περιλαμβάνει τις ακόλουθες κλάσεις:
  •       Η κλάση KeyID αναπαριστά ένα αναγνωριστικό και περιέχει τις κατάλληλες μεθόδους για τις συγκρίσεις αναγνωριστικών που χρειάζονται.
  •      Για την συγκέντρωση όλων των πληροφοριών που είναι απαραίτητες για τη μεταφορά ενός μηνύματος πάνω στο δακτύλιο του Pastry χρησιμοποιείται η κλάση Message, η οποία περιλαμβάνει το αναγνωριστικό το οποίο δρομολογείται στο δακτύλιο, την IP και το port του αρχικού αποστολέα, καθώς και τον τύπο του μηνύματος (JOIN, FILE_INSERT κ.τ.λ.)
  •       Όλες οι δομικές ενότητες του Pastry (leaf set, neighbor set, routing table, available files) βρίσκονται στην κλάση PastryNode.

·         Communication
Στο πακέτο Communication εντοπίζονται όλες οι κλάσεις που σχετίζονται με την επικοινωνία μέσω της τεχνολογίας RMI, καθώς και η υλοποίηση των μεθόδων του πρωτοκόλλου Pastry.
  •     Η κλάση PastryFunctions είναι η διεπαφή η οποία ορίζει αφηρημένα τις προς υλοποίηση κλάσεις (route, forward, downloadFile, uploadFile, updateStructures).
  •      Η κλάση PastryServer περιλαμβάνει την υλοποίηση όλων των μεθόδων που ορίζονται στην κλάση PastryFunctions, καθώς και άλλων, οι οποίες καλούνται τοπικά και όχι μέσω RMI, π.χ. η μέθοδος deliver.
  •      Η απομακρυσμένη κλήση μεθόδων μέσω RMI πραγματοποιείται μέσω της κλάσης PastryClient.

·         Display
Στο τελευταίο πακέτο περιλαμβάνεται η κλάση MainApp, η οποία είναι η υλοποίηση γραφικής διεπαφής για την εφαρμογή αποτελεί την κύρια διασύνδεση των υπολοίπως πακέτων.

Συσχέτιση πακέτων κώδικα

Η συσχέτιση των πακέτων και των κλάσεων διαφαίνεται στο παρακάτω σχήμα:


Το πακέτο Utility χρησιμοποιείται από όλα τα άλλα πακέτα. Το πακέτο Structures αξιοποιείται από το πακέτο Communication και το πακέτο Display, ενώ το πακέτο Communication χρησιμοποιείται μόνο από το πακέτο Display. Τέλος, το πακέτο Display αξιοποιεί μόνο τα άλλα πακέτα και δε χρησιμοποείται από κάποιο.

Αποκλίσεις από τις προδιαγραφές της περιγραφής της αρχιτεκτονικής

Αρχικά, είχε γίνει η παραδοχή πως δύο χρήστες αποφασίζουν τη δημιουργία ενός δακτυλίου και το πραγματοποιούν με τη μεταξύ τους ανταλλαγή πληροφοριών για την αρχικοποίηση των καταστάσεων δρομολόγησης. Αντί αυτού, ο δακτύλιος δημιουργείται με τη βοήθεια ενός αρχικού κόμβου (bootstrap node), με τον οποίο επικοινωνεί κάθε κόμβος που επιθυμεί να εισαχθεί στο δακτύλιο καθόλη τη διάρκεια ύπρξης του δακτυλίου. Καθώς η IP και το port του αρχικού κόμβου είναι γνωστά σε κάθε υποψήφιο χρήστη, ο υποψήφιος χρήστης επικοινωνεί με τον αρχικό κόμβο με χρήση της τεχνολογίας RMI.



Εκτέλεση εφαρμογής

Η μέθοδος εκτέλεσης της εφαρμογής βρίσκεται στην κλάση MainApp του πακέτου Display. To πρώτο στιγμιότυπο της εφαρμογής θα πρέπει να λειτουργήσει ως αρχικός κόμβος (επιλέγοντας το σχετικό check-box). Στη συνέχεια, κάθε νέος κόμβος θα πρέπει να δίνει ως είσοδο προτού ξεκινήσει, μέσω των σχετικών text-boxes, την IP και το port του αρχικού κόμβου.
                Ο αρχικός κόμβος αναλαμβάνει να δρομολογήσει το δακτύλιο ένα JOIN μήνυμα για το νέο κόμβο. Μέσω αυτού του τρόπου και βάσει όσων περιγράφει το πρωτόκολλο Pastry για τη διαδικασία της εισόδου ενός κόμβου, πραγματοποιείται η είσοδος ενός νέου κόμβου παράλληλα με την ενημέρωση των δομών του Pastry κάθε κόμβου που βρίσκεται στο routing path του JOIN μηνύματος. Η διαδικασία εισόδου ολοκληρώθηκε και ο κόμβος είναι έτοιμος να διαθέσει στο δακτύλιο ένα ή περισσότερα αρχεία μουσικής και να αναζητήσει κάποιο αρχείο μουσικής.
                Για την προσθήκη ενός αρχείου στο δακτύλιο, δημιουργείται ένα νέο αναγνωριστικό, βασισμένο στο όνομα του αρχείου, το οποίο παράγεται κατά τον ίδιο τρόπο με το αναγνωριστικό του κόμβου. Στη συνέχεια, δρομολογείται ένα νέο μήνυμα στο δακτύλιο με προορισμό το αναγνωριστικό του αρχείου μουσικής. Μόλις φτάσει στον κόμβο που θα είναι υπεύθυνος για το αρχείο, ο συγκεκριμένος κόμβος “κατεβάζει” το αρχείο από τον κόμβο-πηγή μέσω RMI, καλώντας τη μέθοδο downloadFile.

Τρίτη 8 Φεβρουαρίου 2011

Περιγραφή σταδίων υλοποίησης εφαρμογής

Η ανάπτυξη της εφαρμογής ανταλλαγής μουσικών αρχείων μέσω Pastry overlay πραγματοποιήθηκε στα ακόλουθα στάδια:

  1. Εξοικείωση με την τεχνολογία RMI
  2. Σχεδιασμός της δομής του αναπτυσσόμενου κώδικα (packages), η οποία είναι:
    • πακέτο επικοινωνίας (communication package)
    • πακέτο γραφικής διεπαφής (gui package)
    • πακέτο βασικών δομών (structures package)
    • πακέτο βοηθητικών εργαλείων και μεθόδων (utilities package)
  3. Υλοποίηση των βοηθητικών εργαλείων και μεθόδων και των βασικών δομών, τα οποία απαρτίζονται από:
    • Αναγνωριστικό (είτε κόμβου, είτε αρχείου)
    • Κόμβος Pastry, ο οποίος ενσωματώνει τις όλες τις αναγκαίες δομές (leaf set, neighbor set & routing table)
    • Message, για την επικοινωνία μεταξύ των nodes και σηματοδότηση αυτής
  4. Υλοποίηση της επικοινωνίας, η οποία αποτελείται από τα εξής στοιχεία:
    •  Τύποι μηνυμάτων επικοινωνίας (JOIN, LEAF_SET, FILE_REQUEST κτλ)
    • Διεπαφή (Interface) των μεθόδων που θα εκτελούνται μέσω RMI
    • Client και Server για το RMI, όπου υλοποιούνται οι απαραίτητες μέθοδοι για επικοινωνία μέσω RMI