Κυριακή 18 Ιανουαρίου 2009

Τελική Παράδοση (c)

Για να δουλέψει η εφαρμογή αρχικά θα πρέπει να εκτελεστεί το Server.class σε κάποιο μηχάνημα στο δίκτυο.

Στη συνέχεια κάθε κόμβος μπορεί να εκτελέσει τις εξής ενέργειες:
Αρχικά ανοίγει το πρόγραμμα εκτελώντας το mjmGUI.class


Στη συνέχεια μπορεί να διαλέξει το φάκελο που θέλει ώστε να δίνει τα αρχεία του




Ύστερα θα πρέπει να βάλει το IP του μηχανήματος που τρέχει ο server και το port που θέλει να χρησιμοποιήσει και να πατήσει join.


Αν αυτό το port χρησιμοποιείται σε αυτό το μηχάνημα(ή αν ο server δεν τον έχει διαγράψει από την προηγούμενη σύνδεσή του σε αυτό το port) θα λάβει το εξής μήνυμα.


Μόλις συνδεθεί μπορεί να δει και τους 3 πίνακες πατώντας στα αντίστοιχα tab




Στη συνέχεια μπορεί να ψάξει για ένα αρχείο γράφωντας το όνομα του και την κατάληξη και πατώντας search(που ενεργοποιείται όταν είμαστε συνδεδεμένοι).
Έτσι μπορεί να αναζητήσει ένα αρχείο που ή θα βρίσκετε σε έναν άλλο υπολογιστή και μπορεί να το κατεβάσει

Ή το έχει ήδη στον υπολογιστή του οπότε δεν χρειάζεται να το κατεβάσει

Ή τέλος το αρχείο μπορεί να μην υπάρχει στο σύστημα


Σημειώνουμε εδώ ότι όταν το αρχείο αντιγράφεται θα έχει μπροστά στο όνομα "c_" ώστε να ξεχωρίζουμε ότι έχει μεταφερθεί από αλλού. Πχ το αρχείο "pastry.txt" θα μεταφερθεί ως "c_pastry.txt"

Μία ακόμη επιλογή είναι το How to Use στο Help και το About



Τέλος την ίδια λειτουργία με το "Χ" κάνει και το exit. Δηλαδή στέλνει μήνυμα στους γύρω κόμβους και στον server ότι αποσυνδέθηκε.

Τελική Παράδοση (b)

Σε γενικές γραμμές το σύστημα ακολουθεί την αρχιτεκτονική που είχαμε περιγράψει στην αρχή.
Οι αποκλίσεις(ή και παραλείψεις από την περιγραφή) είναι οι εξής:

Αρχικά κατα τη σύνδεση στο σύστημα (ή σε κάποιο άλλο σημείο) ο κόμβος ανακαλύψει έναν κόμβο που έχει πέσει ενημερώνει τους γύρω κόμβους και τον server ώστε να τον διαγράψουν.
O server αν έχει πάνω από 5 κόμβους στο σύστημα θα στείλει μόνο 5 κόμβους για να γίνει η εκκίνηση της σύνδεσης του κόμβου στο σύστημα τους οποίους και θα διαλέξει τυχαία.
Επίσης κατα την σύνδεσή του ο κόμβος θα στέλνει μία αναφορά για κάθε αρχείο του στον κόμβο που δείχνει η μέθοδος routing.
Ακόμη το ROUTING που λέμε τελικά στην περιγραφή τελικά αναφέρεται στο update των κόμβων ενώ το routing έχει υλοποιηθεί όπως περιγράφεται το SEARCH.
Έτσι οι λειτουργίες που μπορεί να κάνει ένας κόμβος αφού συνδεθεί στο σύστημα είναι να ανανεώσει τους πίνακές του όταν ενημερωθεί για μια αλλαγή(UPDATE), να αναζητήσει ένα αρχείο μέσω του αλγορίθμου routing(SEARCH) και να ανταλλάξει ένα αρχείο(να το στείλει ή να το δεχτεί).
Επίσης μπορεί να ανταλλάξει μηνύματα με άλλους κόμβους(πχ. για να στείλει κάποιο πίνακά του ή να αποθηκεύσει ποιός κόμβος έχει ένα αρχείο).
Τέλος η ανταλλαγή αρχείων τελικά υλοποιήθηκε με Socket File Transfer.

Μία απόκλιση ακόμα μπορεί να θεωρηθεί πως ενώ δουλεύει σε LAN το σύστημα σεν μπορεί να μεταφερθεί στο internet και να δουλέψουν υπολογιστές πίσω σπό router.

Παρασκευή 16 Ιανουαρίου 2009

Τελική Παράδοση (a)

Τα αρχεία που αποτελούν την εφαρμογή είναι τα εξής:

Server.java - Αποτελεί τον server που χρησιμοποιούν οι κόμβοι που θέλουν να συνδεθούν στο σύστημα ώστε να πάρουν τους υπόλοιπους που είναι συνδεδεμένοι και να βρουν κάποιον κόμβο για να ξεκινήσουν την σύνδεση ή να ενημερωθούν οτι είναι οι πρώτοι στο σύστημα. Επίσης τον χρησιμοποιούν οι κόμβοι για να τον ενημερώσουν ότι κάποιος από τους κόμβους έχει πέσει. Αν ο server πέσει οι συνδεδεμένοι κόμβοι συνεχίζουν να δουλεύουν αλλά δεν μπορεί να συνδεθεί κάποιος καινούργιος. (Σε ένα καλύτερο κατανεμημένο σύστημα θα έπρεπε να φτιάξουμε πολλούς servers ώστε να μην υπάρχει point of failure)

mjmGUI.java - Το γραφικό μέρος της εφαρμογής το οποίο καλεί και τα κεντρικά σημεία της εφαρμογής δηλαδή την Client και τις λειτουργίες της.

Client.java - Το Thread που χρησιμοποιεί κάθε κόμβος! Όταν τρέξει καλεί μεθόδους της Node και τρέχει όσο είναι συνδεδεμένος ο κόμβος ανταλλάσσοντας μηνύματα με άλλους κόμβους καθώς και τον server (πριν μπεί και όταν βγαίνει).

Node.java - Η δομή που περιέχει όλες τις μεθόδους που πρέπει να τρέξει κάθε κόμβος δηλαδή τις: join , update , departure, giveFiles, routeMsg και όποια λειτουργία χρειάζεται να κάνει ο κόμβος. Επίσης κρατάει τους πίνακες του κόμβου.

Middleware.java : Έχει κάποιες βοηθητικές μεθόδους που χρησιμοποιεί η Node για να εκτελέσει τις δικές της μεθόδους.

SHA1.java - Έχει την μέθοδο η οποία παίρνει ένα κείμενο και το μετατρέπει μέσω της SHA1 σε id κατάλληλης μορφής(σε συμβολοσειρά 32 ψηφίων από 0 έως 3).

Credentials.java - Η δομή που αποθηκεύει το IP, το port και το NodeID ενός κόμβου

FilesSave.java - Η δομή που αποθηκεύει το όνομα ενός αρχείου και το Credential του κόμβου στον οποίο αντιστοιχεί το αρχείο.

SharedFiles.java - Τάξη που χρησιμοποιείται για το φάκελο που δίνει κάθε κόμβος ώστε να σταλούν τα αρχεία του. Επίσης δημιουργεί, αν δεν υπάρχει, έναν default φάκελο στο Documents του χρήστη.

Join.java, GiveFiles.java - Χρησιμοποιούνται απλά για να καλέσουν τις αντίστοιχες μεθόδους την Node σαν Thread. Με την ίδια λογική καλούμε και την Departure ως Thread έχοντας κάνει Thread τη Node.

Δευτέρα 12 Ιανουαρίου 2009

Threads και debugging...

Σήμερα κάναμε όλες τις λειτουργίες των κόμβων να τρέχουν ως Thread. Δηλαδή τις Join Departure GiveFiles (η μέθοδος που στέλνει την αναφορά για κάθε αρχείο του κόμβου σε αυτόν που επιστρέφει η routing) καθώς και την Client που πάντα τρέχει όσο είναι συνδεδεμένος ο κόμβος και περιμένει μηνύματα ώστε να επικοινωνεί με άλλους κόμβους. Τέλος ασχοληθήκαμε με κάποιες βελτιώσεις στο GUI.

Δυστυχώς η μετατροή σε thread είχε ως αποτέλεσμα σε μερικές αποσυνδέσεις κόμβων ο server να μην τις αντιλαμβάνετε όμως όταν κάποιος κόμβος δει ότι είναι πεσμένος ο συγκεκριμένος ενημερώνει το server οπότε και επανέρχεται η συνέπεια.

Από σήμερα θα ασχοληθούμε κυρίως με το debugging έως ότου η εφαρμογή να λειτουργεί χωρίς σφάλματα!


Κυριακή 11 Ιανουαρίου 2009

Αποθήκευση Λογικών Αρχείων σε Clients και Μεταφορά αρχείου

Σήμερα υλοποιήσαμε τον τρόπο με τον οποίο ο κόμβος που επιστρέφεται από τον αλγόριθμο routing να μπορεί να σώσει τα αρχεία που δίνει κάθε κόμβος όταν εισέρχεται (αν είναι αυτός ο κοντινότερος σε κάθε Hash), καθώς και να σβήνονται όταν ο κόμβος πέσει. Αν ένας κόμβος είναι συνδεδεμένος δεν μπορεί να αλλάξει τα αρχεία που δίνει στο σύστημα αλλά θα πρέπει να βγει και να ξαναεισέλθει. Επίσης ασχοληθήκαμε με μηνύματα που ελέγχουν αν ο κόμβος περιέχει το αρχείο ώστε να μπορεί να το στείλει σε αυτόν που το αναζήτησε. Τέλος υλοποιήσαμε και τη σύνδεση του κόμβου που περιέχει το φυσικό αρχείο καθώς και τη μεταφορά του!

Πέμπτη 8 Ιανουαρίου 2009

Routing και δομή FilesSave

Σήμερα ασχοληθήκαμε με τον αλγόριθμο του routing το οποίο επιστρέφει τον κόμβο με το κοντινότερο NodeID σε σχέση με το id που προκύπτει από το Hashing του ονόματος του αρχείου που θα δώσουμε. Ακόμα δημιουργήσαμε τη δομή της αποθήκευσης των αρχείων FilesSave που αποτελείται από το Credential του κόμβου που τον περιέχει και το όνομα του αρχείου. Έτσι κάθε κόμβος μπορεί να αποθηκεύει τα αρχεία που έχουν id το οποίο μέσω του routing θα επιστρέψει αυτόν τον κόμβο.

Τρίτη 6 Ιανουαρίου 2009

Ενημέρωση για πεσμένους κόμβους

Σήμερα βρήκαμε τις περιπτώσεις που πρέπει να ελέγχεται αν ένας κόμβος έχει πέσει και τις ελέγχουμε ώστε να είναι συνεπείς οι κόμβοι στα δεδομένα που κρατούν και να μην προσπαθούν να συνδεθούν με κόμβους που έχουν αποσυνδεθεί. Επίσης ανανεώσαμε το GUI ώστε να ανανεώνεται σε κάθε αλλαγή των πινάκων.