Προγραμματισμός

Οι εφαρμογές peer-to-peer διευκολύνθηκαν

Έχει ειπωθεί ότι το Kazaa, η εφαρμογή κοινής χρήσης αρχείων peer-to-peer (P2P), προκαλεί περισσότερη κίνηση στο δίκτυο από οποιαδήποτε άλλη εφαρμογή. Ο ιστότοπος Kazaa δηλώνει ότι είχε περισσότερες από 385.000.000 λήψεις! Για σύγκριση, είδα τις κορυφαίες λήψεις του Download.com, οι οποίες παραθέτουν το Ad Aware ως τη δημοφιλέστερη λήψη, με μόλις 117.000.000 λήψεις. Από τις 25 κορυφαίες λήψεις του Download.com, αναγνώρισα 11 εφαρμογές P2P. Μόνο από αυτές τις παρατηρήσεις μόνο, οι εφαρμογές P2P αυξάνονται προφανώς σε δημοτικότητα. Αλλά η κοινή χρήση αρχείων δεν είναι ο μόνος τύπος εφαρμογής P2P. Οι περισσότερες από τις λειτουργίες μιας τυπικής εφαρμογής άμεσων μηνυμάτων είναι P2P. Άλλα παραδείγματα είναι τα φόρουμ και οι κατανεμημένες βάσεις δεδομένων. Και η λίστα συνεχίζει να αυξάνεται.

Για να δημιουργήσετε εφαρμογές P2P όπως αυτές, πρέπει να έχετε μέσα για να ανακαλύψετε και να αλληλεπιδράσετε με άλλους συναδέλφους. Οι περισσότερες από τις δυσκολίες που δημιουργούνται στη δημιουργία εφαρμογών P2P σχετίζονται με τη διατήρηση του δικτύου των ομότιμων, τη μορφοποίηση και τη μετάδοση μηνυμάτων, την ανακάλυψη άλλων συνομηλίκων και άλλα παρόμοια ζητήματα. Το Project Jxta και η δέσμευσή του Java χειρίζονται αυτές τις πτυχές της εφαρμογής σας. Χρησιμοποιώντας το Jxta, μπορείτε να εστιάσετε στην εφαρμογή σας και όχι σε γενικά ζητήματα P2P.

Το Jxta είναι μια συντομευμένη έκδοση της λέξης αντιπαραθέτω, που σημαίνει δίπλα-δίπλα. Ο Οδηγός προγραμματιστή Jxta ορίζει το Jxta ως "μια ανοιχτή πλατφόρμα υπολογιστών σχεδιασμένη για υπολογιστές P2P." Δεν αφορά συγκεκριμένη πλατφόρμα ούτε γλώσσα προγραμματισμού. Σχεδιάστηκε στο Sun Microsystems και κυκλοφόρησε στην κοινότητα ανοιχτού κώδικα για να διατηρηθεί και να αναπτυχθεί. Μαζί με την κυκλοφορία του, εκδόθηκε μια αρχική εφαρμογή Java. Εστιάζω σε αυτήν την εφαρμογή σε αυτό το άρθρο καθώς συζητάω τον τρόπο χρήσης του Jxta σε περιβάλλον Java. Καλύπτω επίσης τις έξι πιο κοινές λειτουργίες εφαρμογών Jxta που εφαρμόζονται στην Java και εισάγω τα εργαλεία που χρειάζεστε για να αρχίσετε να γράφετε τις δικές σας εφαρμογές P2P. Αφού διαβάσετε αυτό το άρθρο, ελπίζω ότι θα έχετε συνειδητοποιήσει πόσο εύκολο και συναρπαστικό είναι να δημιουργήσετε εφαρμογές P2P. Οι εφαρμογές P2P θα συνεχίσουν να αυξάνονται όχι μόνο στη δημοτικότητα, αλλά και στη διαφορετικότητα, και οι προγραμματιστές του αύριο πρέπει να αρχίσουν να μαθαίνουν αυτές τις τεχνολογίες σήμερα για να παραμείνουν στην αιχμή.

Java και Jxta

Το πρώτο βήμα για τη χρήση του Jxta είναι η λήψη του από τη σελίδα λήψεων του Jxta. Όπως θα συμφωνήσουν οι περισσότεροι αναγνώστες, μερικές φορές τα έργα ανοιχτού κώδικα μπορεί να είναι δύσκολο να ληφθούν και να διαμορφωθούν για χρήση. Το Jxta είναι ένα παράδειγμα ενός μεγάλου έργου ανοιχτού κώδικα που είναι επίσης πολύ εύκολο στη λήψη και χρήση αμέσως. Εάν δυσκολεύεστε και χρειάζεστε περισσότερες πληροφορίες σχετικά με τη λήψη και τη χρήση του Jxta, ανατρέξτε στον Οδηγό προγραμματιστή Jxta.

Όταν εκτελείτε για πρώτη φορά μια εφαρμογή με δυνατότητα Jxta από έναν νέο κατάλογο, θα σας παρέχεται ο διαμορφωτής GUI.

Τι είναι ακριβώς ομότιμος; Σύμφωνα με τον Ντάνιελ Μπρούκσαϊρ (ένας γνωστός συνάδελφος της Jxta και ο λεγόμενος «πρωταθλητής»), είναι ένα «σημείο εικονικής επικοινωνίας», όπου μπορούν να τρέχουν διαφορετικοί συνομηλίκοι στην ίδια συσκευή. Η συσκευή δεν περιορίζεται σε υπολογιστή. μπορεί να είναι ένα κινητό τηλέφωνο, ένας διακομιστής ή ακόμη και ένα στοιχείο τόσο απλό όσο ένας αισθητήρας. Υπάρχουν ειδικοί συνομηλίκοι, οι δύο που πρέπει να γνωρίζουμε είναι ραντεβού και αναμετάδοση. Ένα ραντεβού peer επιτρέπει στους ομότιμους να επικοινωνούν έξω από το πεδίο του τοπικού υποδικτύου και ένα ρελέ peer χρησιμοποιείται για τη μετάδοση πληροφοριών μέσω τείχους προστασίας.

Ας ξεκινήσουμε εξετάζοντας τις έξι πιο κοινές λειτουργίες εφαρμογών Jxta, όπως ορίζονται στο "Το κόστος χρήσης του Jxta" (IEEE Computer Society, Σεπτέμβριος 2003). Παρατίθενται παρακάτω με τη σειρά με την οποία συνήθως εμφανίζονται.

  1. Έναρξη Jxta: Η εκκίνηση του Jxta είναι αρκετά απλή και απλά θέμα λίγων γραμμών κώδικα.
  2. Συμμετοχή σε μια ομάδα ομοτίμων: Μια ομάδα συνομηλίκων είναι ένα σύνολο συνομηλίκων που έχουν ένα κοινό σύνολο ενδιαφερόντων που έχουν ομαδοποιηθεί. Σε αυτό το άρθρο, καλύπτω τη συμμετοχή υπαρχόντων ομότιμων ομάδων και τη δημιουργία νέων.
  3. Δημοσίευση διαφημίσεων: Οι διαφημίσεις, απλώς δηλωμένες, είναι το θέμα της Jxta. Το Jxta χρησιμοποιεί τη διαφήμιση για να ανακαλύψει ομότιμους, ομότιμους ομίλους και άλλους πόρους με τρόπο ανεξάρτητο από την πλατφόρμα. Συζητώ την ανάγνωση, τη δημιουργία και την αποστολή νέων διαφημίσεων αργότερα σε αυτό το άρθρο.
  4. Άνοιγμα σωλήνα εισόδου: Ένας σωλήνας είναι ένας μηχανισμός που χρησιμοποιούν οι συνομηλίκοι για να επικοινωνούν μεταξύ τους. Οι σωλήνες είναι εικονική επικοινωνία κανάλια"—Αυτός σε αυτόν τον τρόπο οι χρήστες σωλήνων δεν γνωρίζουν την πραγματική διεύθυνση του άλλου συνοδού. Συζητώ τη χρήση σωλήνων για την αποστολή μηνυμάτων στην ενότητα αυτού του άρθρου σχετικά με τους σωλήνες.
  5. Ανακαλύπτοντας άλλους ομότιμους πόρους: Προτού μπορέσετε να επικοινωνήσετε με άλλους συναδέλφους, πρέπει πρώτα να βρείτε μερικά, τα οποία θα συζητήσω επίσης.
  6. Άνοιγμα σωλήνα εξόδου: Οι σωλήνες εξόδου χρησιμοποιούνται για την αποστολή μηνυμάτων σε άλλους συνομηλίκους. Υπάρχουν δύο κατηγορίες σωλήνων εξόδου: από σημείο σε σημείο, ή ένα προς ένα, και διάδοση, ή ένα προς πολλά.

Τώρα που γνωρίζετε πού θα σας οδηγήσει αυτό το άρθρο, ας ξεκινήσουμε το ταξίδι μας.

Ομάδες συνομηλίκων

Ομότιμες ομάδες είναι απλώς μια συλλογή από συνομηλίκους με κάποια κοινά ενδιαφέροντα. Ομότιμες ομάδες, όπως και οι ομότιμοι, μπορούν να παρέχουν υπηρεσίες, αλλά μια υπηρεσία ομότιμων ομάδων δεν εξαρτάται απαραιτήτως από έναν συγκεκριμένο ομότιμο που ικανοποιεί τα αιτήματά του. Εφόσον ένα άτομο στην ομάδα παρέχει την υπηρεσία, τότε η υπηρεσία είναι διαθέσιμη. Κάθε ομότιμος είναι μέλος του παγκόσμια ομάδα συνομηλίκων και επίσης, συνήθως, το καθαρή ομάδα συνομηλίκων, και μπορεί να επιλέξει να συμμετάσχει και να αφήσει άλλες ομάδες κατά βούληση. Ποιο είναι το κίνητρο για τη δημιουργία ομότιμων ομάδων; Εδώ είναι μερικοί λόγοι:

  • Διατηρήστε την ασφαλή περιοχή: Εάν έχετε μια ασφαλή ομάδα συνομηλίκων, οι συνομηλίκοι της ομάδας δεν χρειάζεται να εκθέσουν τις κρίσιμες πληροφορίες τους.
  • Παρέχετε κοινές υπηρεσίες: Συνήθως, πολλοί συνομηλίκοι θα θέλουν να χρησιμοποιούν / παρέχουν τις ίδιες υπηρεσίες με άλλους συνομηλίκους, οπότε κάτι τέτοιο στην ομάδα έχει νόημα. Για παράδειγμα, θα μπορούσατε να παρέχετε έναν εκτυπωτή ή μια υπηρεσία κατανεμημένης βάσης δεδομένων σε όλους τους συνομηλίκους της ομάδας.
  • Περιοχή αναγνωριστικού ορίου: Τα ονόματα σωλήνων αντιστοιχίζονται με την ομάδα στην οποία έχουν δημιουργηθεί. Εάν δύο σωλήνες έχουν το ίδιο όνομα, αλλά δεν δημιουργήθηκαν στην ίδια ομάδα, τότε δεν υπάρχουν προβλήματα με την αντιμετώπισή τους.

Ας εξετάσουμε πώς μπορούμε να δημιουργήσουμε και να συμμετάσχουμε σε μια ομάδα ομοτίμων. Οι μέθοδοι που παρέχονται από το Ομάδα Ομότιμων διεπαφή παρατίθενται παρακάτω.

  • newGroup (Διαφήμιση pgAdv): χρησιμοποιείται συνήθως για τη δημιουργία μιας ομάδας που υπάρχει ήδη με την ομάδα διαφημίσεων που ανακαλύφθηκε
  • newGroup (PeerGroupID gid, Advertisement impl, String name, String περιγραφή): χρησιμοποιείται συνήθως για την κατασκευή νέων ομότιμων ομάδων
  • newGroup (PeerGroupID gid): χρησιμοποιήθηκε για να δημιουργήσει μια υπάρχουσα, και δημοσιευμένη, ομότιμη ομάδα με μόνο το αναγνωριστικό ομάδας ομότιμων (σκατά)

Δημιουργία ομότιμων ομάδων

Η δημιουργία μιας βασικής ομάδας ομοτίμων είναι σχετικά απλή. Ας δούμε έναν κώδικα:

δοκιμάστε {// Θα δημιουργήσουμε μια νέα ομάδα με βάση το netPeerGroup, οπότε ας αντιγράψουμε την // εμφάνισή της διαφήμιση και να την τροποποιήσουμε. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement (); myPeerGroup = netPeerGroup.newGroup (null, // Δημιουργία νέου αναγνωριστικού ομάδας για αυτήν την ομάδα. implAdv, // Χρησιμοποιήστε την παραπάνω διαφήμιση. "Όνομα ομάδας", // Αυτό είναι το όνομα της ομάδας. "Περιγραφή ομάδας" // Αυτό είναι η περιγραφή της ομάδας.);

System.out.println ("--- Η ομάδα Peer δημιουργήθηκε με επιτυχία, id:" + myPeerGroup.getPeerGroupAdvertisement (). GetID ()); // Τώρα που έχει δημιουργηθεί η ομάδα, δημοσιεύεται αυτόματα και αποθηκεύεται τοπικά, // αλλά πρέπει να τη δημοσιεύσουμε από απόσταση, ώστε να μπορούν να την ανακαλύψουν και άλλοι. discoveryService.remotePublish (myPeerGroup.getPeerGroupAdvertisement ()); System.out.println ("--- Δημοσιεύθηκε απομακρυσμένη διαφήμιση ομότιμων ομάδων"); } catch (Εξαίρεση e) {System.out.println ("Παρουσιάστηκε σφάλμα"); e.printStackTrace (); }

Η κλήση προς νέα ομάδα() δημιουργεί και δημοσιεύει την ομάδα στην τοπική προσωρινή μνήμη. Πιθανότατα, θα θέλετε να δημοσιεύσετε αυτήν τη διαφήμιση σε άλλους συνομηλίκους όταν τη δημιουργείτε, κάτι που μπορείτε να κάνετε τηλεφωνώντας remotePublish (). Αυτή η μέθοδος θα ωθήσει τη διαφήμιση ομότιμων ομάδων σε άλλους συνομηλίκους. Εάν πρέπει να βεβαιωθείτε ότι αποστέλλετε τη διαφήμιση σε συνομηλίκους σε άλλο υποδίκτυο, πρέπει να βεβαιωθείτε ότι είστε συνδεδεμένοι σε συναδέλφους ραντεβού. Για να το κάνετε αυτό, χρησιμοποιήστε τον ακόλουθο κώδικα, υποθέτοντας ότι το ραντεβού σας είναι ομαλό και ρυθμισμένο σωστά:

private void connectToRdv (PeerGroup peerGroup) {if (rdv == null) {// Λήψη της υπηρεσίας rdv rdv = peerGroup.getRendezVousService (); } // Βεβαιωθείτε ότι είμαστε συνδεδεμένοι πριν προχωρήσουμε ενώ (! Rdv.isConnectedToRendezVous ()) {δοκιμάστε {Thread.sleep (5000); } catch (InterruptException e1) {System.out.println ("rdv connect διακοπή"); e1.printStackTrace (); }}} 

Συμμετοχή σε ομότιμες ομάδες

Η συμμετοχή σε μια ομάδα ομοτίμων μπορεί να είναι πιο δύσκολη από τη δημιουργία μιας ομάδας. Ακόμα κι αν έχουμε μια μη ασφαλή ομότιμη ομάδα, πρέπει ακόμα να δημιουργήσουμε διαπιστευτήρια, κενά διαπιστευτήρια και να στείλουμε αυτά τα διαπιστευτήρια στην ομότιμη ομάδα στην οποία προσπαθούμε να λάβουμε μέρος.

Δεδομένου ότι έχουμε μια ομαδική διαφήμιση ομάδας, πρέπει να δημιουργήσουμε όλα τα απαραίτητα διαπιστευτήρια και να γίνουμε μέλος της ομάδας. Πριν κοιτάξουμε το εγγραφή στην ομάδα () μέθοδος, ας δούμε μία από τις τάξεις που χρησιμοποιεί, το Υπηρεσία μέλους τάξη. Υπάρχουν τρεις μέθοδοι Υπηρεσία μέλους που μας ενδιαφέρει, συγκεκριμένα ισχύουν(), Συμμετοχή(), και παραιτούμαι(). Περνάμε στο ισχύουν() μέθοδο τον τύπο ελέγχου ταυτότητας που επιθυμείτε και εάν υποστηρίζεται αυτός ο τύπος, επιστρέφει σε μας ένα Επαληθευτής. Το χρησιμοποιούμε αυτό Επαληθευτής για να μπείτε στην ομάδα. Το περνάμε ως επιχείρημα στο Συμμετοχή() μέθοδος και επαληθεύει τα διαπιστευτήριά μας. Όταν ένας συνομηλίκος θέλει να αποχωρήσει από μια ομάδα, η κλήση προς παραιτούμαι() διευκολύνει αυτό.

Τώρα ας δούμε το εγγραφή στην ομάδα () μέθοδος:

private void joinGroup () {// Υποθέτοντας ότι το myPeerGroup έχει δημιουργηθεί // πριν από την κλήση αυτής της μεθόδου. System.out.println ("Προσπάθεια συμμετοχής στην ομότιμη ομάδα"); δοκιμάστε {// Δημιουργήστε το έγγραφο που θα αναγνωρίσει αυτόν τον ομότιμο. StructuredDocument ταυτότηταInfo = null; // Δεν απαιτούνται πληροφορίες ταυτότητας για την ομάδα μας.

AuthenticationCredential authCred = νέο AuthenticationCredential (myPeerGroup, // Peer group που έχει δημιουργηθεί σε null, // μέθοδος ελέγχου ταυτότητας.); MembershipService MembersService = myPeerGroup.getMembershipService (); Authenticator auth = membershipService.apply (authCred); // Δείτε αν η ομάδα είναι έτοιμη να συμμετάσχει. // Ο Επαληθευτής δεν κάνει καμία διάκριση μεταξύ // αποτυχημένου και ημιτελούς ελέγχου ταυτότητας. εάν (auth.isReadyForJoin ()) {Credential myCred = MembersService.join (auth); System.out.println ("Έγινε μέλος του myPeerGroup"); System.out.println ("Αναγνωριστικό ομάδας:" + myPeerGroup.getPeerGroupID ()); } αλλιώς {System.out.println ("Δεν είναι δυνατή η συμμετοχή στην ομάδα"); }} catch (Εξαίρεση e) {System.out.println ("Παρουσιάστηκε σφάλμα"); e.printStackTrace (); }}

Τώρα που προσχωρήσαμε με επιτυχία στην ομάδα, είμαστε σε θέση να προσφέρουμε παρεχόμενες υπηρεσίες ομότιμων ομάδων και να στέλνουμε μηνύματα στα μέλη. Κατά την ανάπτυξη εφαρμογών P2P, το να σκεφτείτε πού θέλετε τα όρια των ομότιμων ομάδων σας θα σας βοηθήσουν μακροπρόθεσμα. Λάβετε υπόψη ότι τα όρια των ομότιμων ομάδων μπορούν να εκτείνονται σε πολλά δίκτυα.

Η διαδικασία συμμετοχής μπορεί να φαίνεται τρομακτική στην αρχή, αλλά είναι αρκετά απλή όταν το κάνετε μερικές φορές. Τώρα είναι δυνατή η χρήση πολλών διαφορετικών μεθόδων για τη διασφάλιση μιας ομότιμης ομάδας - η πολυπλοκότητα της διαδικασίας σύνδεσης εξαρτάται από τον επιθυμητό τύπο ελέγχου ταυτότητας. Δεν συζητώ αυτές τις μεθόδους εδώ.

Σωλήνες

Όπως εξηγήθηκε προηγουμένως, ένας σωλήνας είναι ένα εικονικό κανάλι επικοινωνίας μεταξύ δύο συνομηλίκων. Οι σωλήνες μπορεί να προκαλέσουν σύγχυση στους αρχάριους, επειδή οι αρχάριοι προσπαθούν να τους συσχετίσουν με αυτά που ήδη γνωρίζουν - πρίζες. Ενώ συζητώ τους σωλήνες, λάβετε υπόψη ότι είναι πολύ πιο αφηρημένοι από τις πρίζες.

Στην πιο βασική μορφή, υπάρχουν δύο τύποι σωλήνων. σωλήνες εισόδου και σωλήνες εξόδου. Οι εφαρμογές χρησιμοποιούν σωλήνες εισόδου για τη λήψη πληροφοριών και σωλήνες εξόδου, για την αποστολή πληροφοριών. Οι σωλήνες μπορούν να χρησιμοποιηθούν σε δύο τρόπους διευθυνσιοδότησης:

  • Σωλήνες Unicast (από σημείο σε σημείο): Αυτοί οι σωλήνες συνδέουν έναν σωλήνα εξόδου με έναν μόνο σωλήνα εισόδου, αλλά ένας σωλήνας εισόδου μπορεί να λαμβάνει μηνύματα από διαφορετικούς σωλήνες εξόδου
  • Πολλαπλασιαστικοί σωλήνες: Αυτοί οι σωλήνες συνδέουν έναν μόνο σωλήνα εξόδου με πολλούς διαφορετικούς σωλήνες εισόδου

Οι σωλήνες είναι ένα αναξιόπιστο, μονοκατευθυντικό και ασύγχρονο μέσο επικοινωνίας. Διατίθενται ενσωματωμένες εφαρμογές σωλήνων που παρέχουν αξιοπιστία, αμφίδρομες δυνατότητες και ασφαλή μεταφορά.

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

Για να δημιουργήσουμε ένα νέο αναγνωριστικό σωλήνα, χρησιμοποιούμε το IDFactory στο net.jxta.id πακέτο. Ακολουθεί ένα δείγμα για το πώς να δημιουργήσετε και να εκτυπώσετε το αναγνωριστικό:

 ID id = IDFactory.newPipeID (peerGroup.getPeerGroupID ()); System.out.println (id.toURI ()); 

Σημείωση:ομότιμη ομάδα είναι η ομότιμη ομάδα για την οποία θέλετε να δημιουργήσετε το σωλήνα.

Έτσι, δύο συμμαθητές μπορούν να επικοινωνούν μεταξύ τους, πρέπει να γνωρίζουν τα αναγνωριστικά σωλήνων για τους σωλήνες με τους οποίους επιθυμούν να επικοινωνήσουν. Υπάρχουν μερικοί τρόποι για να διασφαλιστεί ότι και οι δύο γνωρίζουν αυτές τις πληροφορίες:

  • Και οι δύο συνομηλίκοι διαβάζουν στην ίδια διαφήμιση από ένα αρχείο
  • Το αναγνωριστικό σωλήνα είναι κωδικοποιημένο στις εφαρμογές
  • Δημοσιεύστε και ανακαλύψτε το αναγνωριστικό σωλήνα κατά το χρόνο εκτέλεσης
  • Το Pipe ID δημιουργείται από ένα γνωστό αναγνωριστικό
$config[zx-auto] not found$config[zx-overlay] not found