Programiranje

Enostavne aplikacije med enakovrednimi uporabniki

Rečeno je bilo, da Kazaa, aplikacija za skupno rabo datotek (P2P) povzroča več omrežnega prometa kot katera koli druga aplikacija. Spletna stran Kazaa navaja, da je imela več kot 385.000.000 prenosov! Za primerjavo sem si ogledal največ prenosov na spletnem mestu Download.com, v katerem je Ad Aware najbolj priljubljen prenos s samo 117.000.000 prenosi. Med 25 najboljšimi prenosi Download.com sem prepoznal 11 aplikacij P2P. Samo iz teh opažanj je očitno vse večja priljubljenost aplikacij P2P. Vendar izmenjava datotek ni edina vrsta aplikacije P2P. Večina postopkov tipične aplikacije za neposredna sporočila je P2P. Drugi primeri so forumi in porazdeljene baze podatkov. In seznam samo še narašča.

Če želite ustvariti takšne aplikacije P2P, morate imeti sredstva za odkrivanje in interakcijo z drugimi vrstniki. Večina težav pri ustvarjanju aplikacij P2P je povezanih z vzdrževanjem mreže vrstnikov, formatiranjem in posredovanjem sporočil, odkrivanjem drugih vrstnikov in drugimi podobnimi težavami. Projekt Jxta in njegova vezava Java urejajo te vidike vaše aplikacije. Z uporabo Jxte se lahko osredotočite na svojo aplikacijo in ne na splošna vprašanja P2P.

Jxta je skrajšana različica besede primerjati, kar pomeni vzporedno. V priročniku za programerje Jxta Jxta opredeljuje kot "odprto računalniško platformo, zasnovano za P2P računalništvo". Ni specifičen ne za nobeno platformo ne za noben programski jezik. Zasnovan je bil pri Sun Microsystems in je bil izdan odprtokodni skupnosti za vzdrževanje in rast. Skupaj z izdajo je bila izdana začetna implementacija Jave. V tem članku se osredotočam na to izvedbo, ko razpravljam o uporabi Jxte v okolju Java. Obravnavam tudi šest najpogostejših operacij aplikacij Jxta, implementiranih v Javi, in predstavim orodja, ki jih potrebujete za pisanje lastnih aplikacij P2P. Po branju tega članka upam, da boste spoznali, kako enostavno in vznemirljivo je lahko ustvarjanje aplikacij P2P. Aplikacije P2P bodo še naprej rasle ne samo v priljubljenosti, temveč tudi v raznolikosti, jutrišnji razvijalci pa se morajo te tehnologije začeti učiti danes, da ostanejo na vrhu.

Java in Jxta

Prvi korak k uporabi Jxte je prenos s strani za prenos Jxta. Kot se bo strinjala večina bralcev, je včasih odprtokodne projekte težko pridobiti in konfigurirati za uporabo. Jxta je primer odličnega odprtokodnega projekta, ki je tudi zelo enostaven za prenos in uporabo takoj. Če imate težave in potrebujete več informacij o prenosu in uporabi Jxte, glejte Navodila za programerje Jxta.

Ko prvič zaženete aplikacijo, ki podpira Jxta, iz novega imenika, boste dobili konfigurator GUI.

Kaj pravzaprav je vrstnik? Po mnenju Daniela Brookshirea (znanega zagovornika Jxte in tako imenovanega "prvaka") gre za "virtualno komunikacijsko točko", kjer lahko različni vrstniki tečejo na isti napravi. Naprava ni omejena na osebni računalnik; lahko je mobilni telefon, strežnik ali celo tako preprost element kot senzor. Obstajajo posebni vrstniki, ki se jih moramo zavedati sestanek in rele. Vzporedni vrstnik omogoča vrstnikom, da komunicirajo zunaj obsega lokalne podomrežje, relejni vmesnik pa se uporablja za posredovanje informacij prek požarnih zidov.

Začnimo s pregledom šestih najpogostejših aplikacijskih operacij Jxta, kot so opredeljene v "Stroški uporabe Jxte" (IEEE Computer Society, september 2003). Spodaj so navedeni v vrstnem redu, v katerem se običajno pojavljajo.

  1. Zagon Jxte: Zagon Jxte je precej preprost in preprosto zadeva nekaj vrstic kode.
  2. Pridružitev skupini vrstnikov: Skupina vrstnikov je vrsta vrstnikov, ki imajo skupni niz interesov, ki so bili združeni. V tem članku opisujem pridružitev obstoječim skupinam vrstnikov in ustvarjanje novih.
  3. Objavljanje oglasov: Preprosto povedano, oglasi so tisto, kar Jxta sploh predstavlja. Jxta uporablja oglaševanje za odkrivanje vrstnikov, skupin vrstnikov in drugih virov na način, neodvisen od platforme. V nadaljevanju tega članka razpravljam o branju, ustvarjanju in pošiljanju novih oglasov.
  4. Odpiranje vhodne cevi: Cev je mehanizem, ki ga vrstniki uporabljajo za medsebojno komunikacijo. Cevi so "navidezna komunikacija kanalov"- v tej verziji uporabniki dejansko ne poznajo dejanskega naslova drugega vrstnika. V razdelku o ceveh v tem članku razpravljam o uporabi cevi.
  5. Odkrivanje drugih vrstniških virov: Preden lahko komunicirate z drugimi vrstniki, morate najprej najti nekaj, o čemer bom tudi razpravljal.
  6. Odpiranje izhodne cevi: Izhodne cevi se uporabljajo za pošiljanje sporočil drugim vrstnikom. Obstajata dva razreda izhodnih cevi: od točke do točke, ali ena na ena in razmnoževanje, ali ena-do-mnogih.

Zdaj, ko veste, kam vas bo pripeljal ta članek, začnimo svojo pot.

Skupine vrstnikov

Skupine vrstnikov so preprosto skupek vrstnikov z nekaterimi skupnimi interesi. Skupine vrstnikov, tako kot vrstniki, lahko nudijo storitve, vendar storitev vrstnikov ni nujno odvisna od določenega vrstnika, ki izpolnjuje zahteve zanj. Dokler storitev ponuja en vrstnik v skupini, je storitev na voljo. Vsak vrstnik je član svetovna skupina vrstnikov in tudi tipično neto skupina vrstnikov, in se lahko po volji pridružijo drugim skupinam in jih zapustijo. Kakšna je motivacija za ustvarjanje vrstniških skupin? Tu je nekaj razlogov:

  • Vzdrževanje varne regije: Če imate varno skupino vrstnikov, vrstnikom v skupini ni treba razkriti svojih kritičnih informacij.
  • Zagotovite skupne storitve: Običajno bo veliko vrstnikov želelo uporabljati / zagotavljati enake storitve kot drugi vrstniki, zato je to v skupini smiselno. Na primer, vsem vrstnikom v skupini lahko zagotovite tiskalnik ali storitev porazdeljene baze podatkov.
  • Obseg ID-ja omejitve: Imena cevi se ujemajo s skupino, v kateri so ustvarjene. Če imata dve cevi isto ime, vendar nista bili ustvarjeni v isti skupini, potem z njimi ni težav.

Preučimo, kako lahko ustvarimo in se pridružimo skupini vrstnikov. Metode, ki jih zagotavlja Vrstniki vmesniki so navedeni spodaj.

  • newGroup (Oglas pgAdv): običajno se uporablja za instanciranje skupine, ki že obstaja z odkritim oglasom skupine
  • newGroup (PeerGroupID gid, impl reklame, ime niza, opis niza): običajno se uporablja za konstruiranje novih skupin vrstnikov
  • newGroup (PeerGroupID gid): uporablja se za instanciranje obstoječe in objavljene enakovredne skupine z samo ID enakovredne skupine (gid)

Ustvarjanje skupin vrstnikov

Ustvarjanje osnovne skupine vrstnikov je razmeroma enostavno. Poglejmo si nekaj kode:

poskusite {// Na podlagi netPeerGroup bomo ustvarili novo skupino, zato kopirajmo njen // impl oglas in ga spremenimo. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement (); myPeerGroup = netPeerGroup.newGroup (null, // Ustvari nov ID skupine za to skupino. implAdv, // Uporabi zgornji oglas. "Ime skupine", // To je ime skupine. "Opis skupine" // Ta je opis skupine.);

System.out.println ("--- Uspešno ustvarjena skupina vrstnikov, id:" + myPeerGroup.getPeerGroupAdvertisement (). GetID ()); // Zdaj, ko je skupina ustvarjena, se samodejno objavi in ​​shrani lokalno, // vendar jo moramo objaviti na daljavo, da jo lahko odkrijejo drugi vrstniki. discoveryService.remotePublish (myPeerGroup.getPeerGroupAdvertisement ()); System.out.println ("--- Daljinsko objavljen oglas skupine vrstnikov"); } catch (Izjema e) {System.out.println ("Prišlo je do napake"); e.printStackTrace (); }

Klic k newGroup () ustvari in objavi skupino v lokalnem predpomnilniku. Najverjetneje boste želeli ta oglas objaviti drugim vrstnikom, ko ga ustvarite, kar lahko storite s klicem remotePublish (). Ta metoda bo oglas vrstniške skupine potisnila k drugim vrstnikom. Če morate oglas poslati vrstnikom v drugi podomrežji, morate zagotoviti, da ste povezani z vrstnikom za srečanje. Če želite to narediti, uporabite naslednjo kodo, če predpostavite, da je enakovredna točka za sestanek in pravilno konfigurirana:

private void connectToRdv (PeerGroup peerGroup) {if (rdv == null) {// Pridobite rdv storitev rdv = peerGroup.getRendezVousService (); } // Pred nadaljevanjem preverite, ali smo povezani (! Rdv.isConnectedToRendezVous ()) {try {Thread.sleep (5000); } catch (InterruptedException e1) {System.out.println ("rdv connect interrupted"); e1.printStackTrace (); }}} 

Pridruževanje skupinam vrstnikov

Pridružiti se skupini vrstnikov je lahko težje, kot pa jo dejansko ustvariti. Tudi če imamo nezaščiteno istovrstno skupino, moramo vseeno ustvariti poverilnice, izprazniti poverilnice in jih poslati skupini enakovrednih oseb, ki se ji želimo pridružiti.

Ker imamo oglas skupine vrstnikov, moramo ustvariti vse potrebne poverilnice in se pridružiti skupini. Preden pogledamo Pridruži se skupini() poglejmo enega od razredov, ki jih uporablja, MembershipService razred. Obstajajo tri metode MembershipService ki nas zanimajo uporabi (), pridruži se (), in odstopi (). Prehodimo na uporabi () metoda želeno vrsto preverjanja pristnosti in če je ta vrsta podprta, nam vrne Avtentifikator. To uporabljamo Avtentifikator da se dejansko pridružite skupini. Kot argument posredujemo pridruži se () in preveri naše poverilnice. Ko vrstnik želi zapustiti skupino, klic na odstopi () to olajša.

Zdaj pa poglejmo Pridruži se skupini() metoda:

private void joinGroup () {// Če predpostavimo, da je bil myPeerGroup instantiran // pred klicem te metode. System.out.println ("Poskus pridružitve skupini vrstnikov"); poskusite {// Ustvarite dokument, ki bo identiteto tega enakovrednega računalnika. StructuredDocument identityInfo = null; // Za našo skupino niso potrebni podatki o identiteti.

AuthenticationCredential authCred = novo AuthenticationCredential (myPeerGroup, // Peer group, da je ustvarjena v null, // metoda overjanja.); MembershipService memberService = myPeerGroup.getMembershipService (); Authenticator auth = članstvoService.apply (authCred); // Preverite, ali je skupina pripravljena na pridružitev. // Authenticator trenutno ne razlikuje med // neuspešno in nedokončano overitvijo. if (auth.isReadyForJoin ()) {poverilnica myCred = memberService.join (auth); System.out.println ("Pridružen skupini myPeerGroup"); System.out.println ("ID skupine:" + myPeerGroup.getPeerGroupID ()); } else {System.out.println ("Ne morem se pridružiti skupini"); }} catch (izjema e) {System.out.println ("Prišlo je do napake"); e.printStackTrace (); }}

Zdaj, ko smo se uspešno pridružili skupini, lahko uporabljamo zagotovljene storitve vrstniške skupine in članom pošiljamo sporočila. Pri razvoju aplikacij P2P vam bo dolgoročno pomagalo razmišljati o tem, kje želite, da meje vrstniških skupin obstajajo pred časom. Upoštevajte, da lahko meje vrstniških skupin obsegajo številna omrežja.

Postopek pridruževanja se sprva zdi zastrašujoč, vendar je po nekajkrat precej preprost. Zdaj je mogoče uporabiti veliko različnih metod za zaščito skupine enakovrednih uporabnikov - zapletenost postopka združevanja je odvisna od vrste želene avtentikacije. Tu ne razpravljam o teh metodah.

Cevi

Kot smo že pojasnili, je cev navidezni komunikacijski kanal med dvema vrstnikoma. Cevi so lahko začetnike zmede, ker jih novince poskušajo povezati s tistim, kar že poznajo - vtičnicami. Medtem ko razpravljam o ceveh, ne pozabite, da so veliko bolj abstraktne kot vtičnice.

V najosnovnejši obliki obstajata dve vrsti cevi; vhodne in izhodne cevi. Aplikacije uporabljajo vhodne cevi za sprejemanje informacij in izhodne cevi za pošiljanje informacij. Cevi se lahko uporabljajo v dveh načinih naslavljanja:

  • Unicast (od točke do točke) cevi: Te cevi povezujejo eno izhodno cev z eno vhodno cevjo, vendar lahko ena vhodna cev sprejema sporočila iz različnih izhodnih cevi
  • Razmnoževalne cevi: Te cevi povezujejo eno izhodno cev z veliko različnimi vhodnimi cevmi

Cevi so nezanesljivo, enosmerno in asinhrono sredstvo komunikacije. Na voljo so okrepljene izvedbe cevi, ki zagotavljajo zanesljivost, dvosmerne zmogljivosti in varen tranzit.

Če želite ustvariti pipe, morate najprej ustvariti oglas za pipe in ga objaviti. Potem morate dobiti storitev cevi od skupine enakovrednih uporabnikov in jo uporabiti za ustvarjanje cevi. Vsaka cev ima povezan ID cevi, ki se uporablja za naslavljanje cevi.

Za izdelavo novega ID-ja cevi uporabimo IDFactory v net.jxta.id paket. Tu je vzorec, kako ustvariti in natisniti ID:

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

Opomba:vrstniki je enakovredna skupina, za katero želite ustvariti cev.

Tako lahko dva vrstnika komunicirata med seboj, vedeti morata ID-je cevi za cevi, s katerimi želijo komunicirati. Obstaja nekaj načinov, kako zagotoviti, da oba poznata te informacije:

  • Oba vrstnika bereta v isti cevi oglas iz datoteke
  • ID cevi je trdo kodiran v aplikacije
  • Objavite in odkrijte ID cevi med izvajanjem
  • ID cevi se generira iz dobro znanega ID-ja
$config[zx-auto] not found$config[zx-overlay] not found