Programmering

Peer-to-peer-applikationer er lette

Det er blevet sagt, at Kazaa, peer-to-peer (P2P) fildelingsapplikation, forårsager mere netværkstrafik end enhver anden applikation. Kazaa-webstedet siger, at det har haft mere end 385.000.000 downloads! Til sammenligning så jeg Download.coms top downloads, der viser Ad Aware som den mest populære download med kun 117.000.000 downloads. Fra Download.coms top 25 downloads genkendte jeg 11 P2P-applikationer. Bare fra disse observationer alene vokser P2P-applikationer naturligvis i popularitet. Men fildeling er ikke den eneste type P2P-applikation. De fleste af operationerne i en typisk instant messaging-applikation er P2P. Andre eksempler er fora og distribuerede databaser. Og listen fortsætter bare med at vokse.

For at oprette P2P-applikationer som disse skal du have et middel til at opdage og interagere med andre jævnaldrende. De fleste af de vanskeligheder, der er involveret i oprettelsen af ​​P2P-applikationer, er relateret til vedligeholdelse af netværket af jævnaldrende, formatering og videresendelse af meddelelser, opdagelse af andre jævnaldrende og andre lignende problemer. Project Jxta og dets Java-binding håndterer disse aspekter af din applikation. Ved at bruge Jxta kan du fokusere på din applikation, ikke generiske P2P-problemer.

Jxta er en forkortet version af ordet sidestillet, hvilket betyder side om side. Jxta Programmer's Guide definerer Jxta som "en åben computerplatform designet til P2P-computing." Det er specifikt hverken for nogen platform eller noget programmeringssprog. Det blev udtænkt hos Sun Microsystems og er blevet frigivet til open source-samfundet for at vedligeholde og vokse. Sammen med frigivelsen blev der udgivet en indledende Java-implementering. Jeg fokuserer på denne implementering i denne artikel, da jeg diskuterer, hvordan man bruger Jxta i et Java-miljø. Jeg dækker også de seks mest almindelige operationer af Jxta-applikationer implementeret i Java og introducerer de værktøjer, du har brug for til at begynde at skrive dine egne P2P-applikationer. Efter at have læst denne artikel håber jeg, at du vil have indset, hvor let og spændende det kan være at oprette P2P-applikationer. P2P-applikationer vil fortsætte med at vokse ikke kun i popularitet, men også i mangfoldighed, og morgendagens udviklere skal begynde at lære disse teknologier i dag for at forblive i forkant.

Java og Jxta

Det første skridt til at bruge Jxta er at downloade det fra Jxta-downloadsiden. Som de fleste læsere er enige om, kan open source-projekter undertiden være vanskelige at erhverve og konfigurere til brug. Jxta er et eksempel på et godt open source-projekt, der også er meget let at downloade og bruge med det samme. Hvis du har svært ved og har brug for flere oplysninger om download og brug af Jxta, skal du læse Jxta programmeringsvejledning.

Når du først kører en Jxta-aktiveret applikation fra en ny mappe, får du GUI-konfiguratoren.

Hvad er egentlig en peer? Ifølge Daniel Brookshire (en velkendt Jxta-committer og såkaldt "champion") er det et "virtuelt kommunikationspunkt", hvor forskellige jævnaldrende kan køre på den samme enhed. Enheden er ikke begrænset til en pc; det kan være en mobiltelefon, en server eller endda en vare så enkel som en sensor. Der er specielle jævnaldrende, de to, som vi skal være opmærksomme på, er rendezvous og relæ. En rendezvous-peer giver peers mulighed for at kommunikere uden for det lokale subnet, og en relay-peer bruges til at videresende information gennem firewalls.

Lad os starte med at gå over de seks mest almindelige Jxta-applikationshandlinger, som defineret i "Omkostningerne ved at bruge Jxta" (IEEE Computer Society, september 2003). De er anført nedenfor i den rækkefølge, som de typisk forekommer i.

  1. Start af Jxta: At starte Jxta er ret simpelt og simpelthen et spørgsmål om nogle få linier kode.
  2. Deltagelse i en peer-gruppe: En jævnaldrende gruppe er et sæt jævnaldrende, der har et fælles sæt interesser, der er grupperet sammen. I denne artikel dækker jeg deltagelse i eksisterende peer-grupper og oprettelse af nye.
  3. Udgivelsesannoncer: Annoncer, ganske enkelt sagt, er hvad Jxta handler om. Jxta bruger reklame til at opdage jævnaldrende, peer-grupper og andre ressourcer på en platformuafhængig måde. Jeg diskuterer læsning, oprettelse og afsendelse af nye reklamer senere i denne artikel.
  4. Åbning af et inputrør: Et rør er en mekanisme, som jævnaldrende bruger til at kommunikere med hinanden. Rør er "virtuel kommunikation kanaler"- faktisk ved, at rørbrugerne ikke kender den anden kammerats faktiske adresse. Jeg diskuterer at bruge rør til at sende meddelelser i denne artikels afsnit om rør.
  5. Opdage andre peer-ressourcer: Før du kan kommunikere med andre jævnaldrende, skal du først finde nogle, som jeg også vil diskutere.
  6. Åbning af et udgangsrør: Output-rør bruges til at sende meddelelser til andre jævnaldrende. Der er to klasser af udgangsrør: punkt til punkt, eller en-til-en, og formering, eller en-til-mange.

Nu hvor du ved, hvor denne artikel vil føre dig, lad os starte vores rejse.

Peer-grupper

Peer-grupper er simpelthen en samling af jævnaldrende med nogle sæt fælles interesser. Peer-grupper, ligesom peers, kan levere tjenester, men en peer-group-service er ikke nødvendigvis afhængig af en specifik peer, der opfylder anmodninger til den. Så længe en enkelt peer i gruppen leverer tjenesten, så er tjenesten tilgængelig. Hver peer er medlem af verdens jævnaldrende gruppe og også typisk net peer group, og kan vælge at deltage og forlade andre grupper efter eget valg. Hvad er motivationen til at oprette jævnaldrende grupper? Her er et par grunde:

  • Oprethold sikker region: Hvis du har en sikker peer-gruppe, behøver peers i gruppen ikke at udsætte deres kritiske information.
  • Lever fælles tjenester: Typisk vil mange jævnaldrende ønske at bruge / levere de samme tjenester som andre jævnaldrende, så det er bare fornuftigt at gøre det i gruppen. For eksempel kan du levere en printer eller en distribueret databasetjeneste til alle jævnaldrende i gruppen.
  • Begræns id-omfang: Rørnavne matches med gruppen, som de er oprettet i. Hvis to rør har samme navn, men ikke blev oprettet i samme gruppe, er der ingen problemer med at adressere dem.

Lad os undersøge, hvordan vi kan oprette og deltage i en peer-gruppe. Metoderne leveret af PeerGroup interface er angivet nedenfor.

  • newGroup (Annonce pgAdv): bruges typisk til at starte en gruppe, der allerede findes med den opdagede gruppeannonce
  • newGroup (PeerGroupID gid, Advertising impl, String name, String description): bruges typisk til at konstruere nye peer-grupper
  • newGroup (PeerGroupID gid): bruges til at instantiere en eksisterende og offentliggjort peer-gruppe med kun peer group ID (gid)

Oprettelse af peer-grupper

Oprettelse af en grundlæggende peer-gruppe er relativt ligetil. Lad os se på en kode:

prøv {// Vi opretter en ny gruppe baseret på netPeerGroup, så lad os kopiere dens // impl-annonce og ændre den. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement (); myPeerGroup = netPeerGroup.newGroup (null, // Opret et nyt gruppe-id til denne gruppe. implAdv, // Brug ovenstående annonce. "Gruppens navn", // Dette er gruppens navn. "Gruppebeskrivelse" // Dette er beskrivelsen af ​​gruppen.);

System.out.println ("--- Peer-gruppe oprettet med succes, id:" + myPeerGroup.getPeerGroupAdvertisement (). GetID ()); // Nu hvor gruppen oprettes, offentliggøres den og gemmes automatisk lokalt, // men vi er nødt til at udgive den eksternt, så andre jævnaldrende kan opdage den. discoveryService.remotePublish (myPeerGroup.getPeerGroupAdvertisement ()); System.out.println ("--- Udgivet peer group-reklame eksternt"); } fange (Undtagelse e) {System.out.println ("Der opstod en fejl"); e.printStackTrace (); }

Opkaldet til newGroup () opretter og udgiver gruppen til den lokale cache. Mest sandsynligt vil du gerne offentliggøre denne annonce til andre jævnaldrende, når du opretter den, hvilket du kan gøre ved at ringe remotePublish (). Denne metode vil skubbe peer group-reklamen til andre jævnaldrende. Hvis du har brug for at sikre dig, at du sender reklamen til jævnaldrende på et andet undernet, skal du sikre dig, at du er forbundet til en rendezvous-jævnaldrende. For at gøre dette skal du bruge følgende kode, forudsat at din rendezvous-peer er oppe og konfigureret korrekt:

privat ugyldigt connectToRdv (PeerGroup peerGroup) {if (rdv == null) {// Få rdv-tjenesten rdv = peerGroup.getRendezVousService (); } // Sørg for, at vi er forbundet, inden du fortsætter, mens (! Rdv.isConnectedToRendezVous ()) {prøv {Thread.sleep (5000); } fange (InterruptedException e1) {System.out.println ("rdv-forbindelse afbrudt"); e1.printStackTrace (); }}} 

Deltagelse i jævnaldrende grupper

Det kan være sværere at deltage i en peer-gruppe end at oprette en. Selvom vi har en usikker peer-gruppe, skal vi stadig oprette legitimationsoplysninger, tomme legitimationsoplysninger og sende disse legitimationsoplysninger til den peer-gruppe, vi prøver at deltage i.

Da vi har en peer group-annonce, skal vi oprette alle nødvendige legitimationsoplysninger og deltage i gruppen. Før vi ser på Tilmeld gruppe() metode, lad os se på en af ​​de klasser, den bruger, den MembershipService klasse. Der er tre metoder i MembershipService som vi specifikt er interesseret i ansøge(), tilslutte()og træde tilbage(). Vi videregiver til ansøge() metode den ønskede type godkendelse, og hvis den type understøttes, vender den tilbage til os en Authenticator. Vi bruger dette Authenticator at faktisk deltage i gruppen. Vi sender det som et argument til tilslutte() metode, og det bekræfter vores legitimationsoplysninger. Når en kammerat ønsker at forlade en gruppe, kaldes op til træde tilbage() letter dette.

Lad os nu se på Tilmeld gruppe() metode:

private void joinGroup () {// Under forudsætning af, at myPeerGroup er blevet instantieret // før jeg kalder denne metode. System.out.println ("Forsøger at deltage i peer group"); prøv {// Opret det dokument, der identificerer denne peer. StructuredDocument identityInfo = null; // Der kræves ingen identitetsoplysninger for vores gruppe.

AuthenticationCredential authCred = ny AuthenticationCredential (myPeerGroup, // Peer-gruppe, som den oprettes i null, // godkendelsesmetode.); MembershipService membershipService = myPeerGroup.getMembershipService (); Authenticator auth = membershipService.apply (authCred); // Se om gruppen er klar til at blive medlem. // Authenticator skelner i øjeblikket ikke mellem // mislykket og ufærdig godkendelse. hvis (auth.isReadyForJoin ()) {Credential myCred = membershipService.join (auth); System.out.println ("Tilmeldt myPeerGroup"); System.out.println ("Gruppe-id:" + myPeerGroup.getPeerGroupID ()); } andet {System.out.println ("Kan ikke deltage i gruppen"); }} fange (Undtagelse e) {System.out.println ("Der opstod en fejl"); e.printStackTrace (); }}

Nu hvor vi med succes er blevet medlem af gruppen, er vi i stand til at ansætte leverede peer group-tjenester og sende beskeder til medlemmerne. Når du udvikler P2P-applikationer, kan det på lang sigt hjælpe dig med at tænke på, hvor du vil have dine peer group-grænser på forhånd. Husk, at peer group-grænser kan spænde over mange netværk.

Tilslutningsprocessen kan virke skræmmende i starten, men det er ret ligetil, når du først gør det et par gange. Nu er det muligt at anvende mange forskellige metoder til at sikre en peer-gruppe - kompleksiteten af ​​tilslutningsprocessen afhænger af den ønskede type godkendelse. Jeg diskuterer ikke disse metoder her.

Rør

Som tidligere forklaret er et rør en virtuel kommunikationskanal mellem to jævnaldrende. Rør kan være forvirrende for begyndere, fordi nybegyndere prøver at relatere dem til det, de allerede ved - stikkontakter. Mens jeg diskuterer rør, skal du huske på, at de er meget mere abstrakte end stikkontakter.

I den mest basale form er der to typer rør; indgangsrør og udgangsrør. Applikationer bruger inputrør til at modtage information og outputrør til at sende information. Rør kan bruges i to adresseringstilstande:

  • Unicast-rør (punkt-til-punkt): Disse rør forbinder et outputrør til et enkelt inputrør, men et enkelt inputrør kan modtage meddelelser fra forskellige outputrør
  • Formere rør: Disse rør forbinder et enkelt udgangsrør til mange forskellige indgangsrør

Rør er et upålideligt, ensrettet og asynkront kommunikationsmiddel. Beefed-up implementeringer af rør er tilgængelige, der giver pålidelighed, tovejsfunktioner og sikker transit.

For at oprette et rør skal du først oprette en rørannonce og offentliggøre det. Derefter skal du hente rørtjenesten fra peer-gruppen og bruge den til at oprette røret. Hvert rør har et rør-ID tilknyttet, som bruges til at adressere røret.

For at oprette et nyt rør-ID bruger vi IDFactory i net.jxta.id pakke. Her er et eksempel på, hvordan man opretter og udskriver ID'et:

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

Bemærk:peerGroup er den peer-gruppe, som du vil oprette røret for.

Så to jævnaldrende kan kommunikere med hinanden, de skal kende rør-ID'erne til de rør, som de ønsker at kommunikere med. Der er et par måder at sikre, at de begge kender disse oplysninger:

  • Begge jævnaldrende læser i samme rørannonce fra en fil
  • Rør-ID'et er hårdkodet i applikationerne
  • Offentliggør og opdag rør-ID'et ved kørsel
  • Rør-ID genereres ud fra et velkendt ID