Programmering

Peer-to-peer-applikasjoner er enkle

Det har blitt sagt at Kazaa, peer-to-peer (P2P) fildelingsapplikasjon, forårsaker mer nettverkstrafikk enn andre applikasjoner. Kazaa-nettstedet oppgir at den har hatt mer enn 385 000 000 nedlastinger! Til sammenligning så jeg på Download.coms toppnedlastinger, som viser Ad Aware som den mest populære nedlastingen, med bare 117.000.000 nedlastinger. Fra Download.coms 25 beste nedlastinger kjente jeg igjen 11 P2P-applikasjoner. Bare fra disse observasjonene alene vokser P2P-applikasjoner åpenbart i popularitet. Men fildeling er ikke den eneste typen P2P-applikasjon. De fleste operasjonene til et typisk direktemeldingsprogram er P2P. Andre eksempler er fora og distribuerte databaser. Og listen fortsetter bare å vokse.

For å lage P2P-applikasjoner som disse, må du ha et middel for å oppdage og samhandle med andre jevnaldrende. De fleste vanskelighetene som er involvert i å lage P2P-applikasjoner er knyttet til å opprettholde nettverket av jevnaldrende, formatering og formidling av meldinger, oppdage andre jevnaldrende og andre lignende problemer. Project Jxta og dets Java-binding håndterer disse aspektene av applikasjonen din. Ved å bruke Jxta kan du fokusere på applikasjonen din, ikke generiske P2P-problemer.

Jxta er en forkortet versjon av ordet sidestill, som betyr side om side. Jxta Programmer's Guide definerer Jxta som "en åpen databehandlingsplattform designet for P2P-databehandling." Det er spesifikt verken for noen plattform eller noe programmeringsspråk. Den ble unnfanget hos Sun Microsystems og har blitt gitt ut til åpen kildekode for å opprettholde og vokse. Sammen med utgivelsen ble det gitt en første Java-implementering. Jeg fokuserer på den implementeringen i denne artikkelen mens jeg diskuterer hvordan du bruker Jxta i et Java-miljø. Jeg dekker også de seks vanligste operasjonene til Jxta-applikasjoner implementert i Java og introduserer verktøyene du trenger for å begynne å skrive dine egne P2P-applikasjoner. Etter å ha lest denne artikkelen håper jeg at du vil ha innsett hvor enkelt og spennende det kan være å lage P2P-applikasjoner. P2P-applikasjoner vil fortsette å vokse ikke bare i popularitet, men også i mangfold, og morgendagens utviklere må begynne å lære disse teknologiene i dag for å holde seg i forkant.

Java og Jxta

Det første trinnet for å bruke Jxta er å laste ned det fra Jxta-nedlastingssiden. Som de fleste lesere er enige, kan det være vanskelig å skaffe og konfigurere åpen kildekode-prosjekter for bruk. Jxta er et eksempel på et flott open source-prosjekt som også er veldig enkel å laste ned og bruke med en gang. Hvis du har det vanskelig og trenger mer informasjon om nedlasting og bruk av Jxta, se Jxta programmeringshåndbok.

Når du først kjører et Jxta-aktivert program fra en ny katalog, får du GUI-konfiguratoren.

Hva er egentlig en jevnaldrende? I følge Daniel Brookshire (en kjent Jxta-committer og såkalt "champion") er det et "virtuelt kommunikasjonspunkt", der forskjellige jevnaldrende kan kjøre på samme enhet. Enheten er ikke begrenset til en PC; det kan være en mobiltelefon, en server eller til og med et element så enkelt som en sensor. Det er spesielle jevnaldrende, de to som vi trenger å være klar over er stevnemøte og stafett. En rendezvous peer tillater jevnaldrende å kommunisere utenfor omfanget av det lokale delnettet, og en relay-peer brukes til å videreformidle informasjon gjennom brannmurer.

La oss starte med å gå gjennom de seks vanligste Jxta-applikasjonsoperasjonene, som definert i "The Costs of Using Jxta" (IEEE Computer Society, september 2003). De er oppført nedenfor i den rekkefølgen de vanligvis forekommer.

  1. Starter Jxta: Å starte Jxta er ganske enkelt og ganske enkelt et spørsmål om noen få linjer med kode.
  2. Bli med i en jevnaldrende gruppe: En jevnaldrende gruppe er et sett med jevnaldrende som har et felles sett med interesser som er gruppert sammen. I denne artikkelen dekker jeg med å bli med i eksisterende jevnaldrende grupper og lage nye.
  3. Publiseringsannonser: Annonser, ganske enkelt oppgitt, er det Jxta handler om. Jxta bruker reklame for å oppdage jevnaldrende, jevnaldrende grupper og andre ressurser på en plattformuavhengig måte. Jeg diskuterer lesing, oppretting og sending av nye annonser senere i denne artikkelen.
  4. Åpne et inngangsrør: Et rør er en mekanisme som jevnaldrende bruker for å kommunisere med hverandre. Rør er "virtuell kommunikasjon kanaler"- faktisk fordi brukerne av rør ikke kjenner den andre faktiske adressen. Jeg diskuterer bruk av rør for å sende meldinger i denne artikkelen om rør.
  5. Oppdage andre kollegaer: Før du kan kommunisere med andre jevnaldrende, må du først finne noen, som jeg også vil diskutere.
  6. Åpne et utgangsrør: Utgangsrør brukes til å sende meldinger til andre jevnaldrende. Det er to klasser av utgangsrør: punkt til punkt, eller en-til-en, og forplantning, eller en-til-mange.

Nå som du vet hvor denne artikkelen tar deg, la oss starte reisen.

Jevnaldrende grupper

Jevnaldrende grupper er rett og slett en samling av jevnaldrende med noen sett med felles interesser. Jevnaldrende grupper, som jevnaldrende, kan tilby tjenester, men en jevnaldrende gruppetjeneste er ikke nødvendigvis avhengig av en bestemt jevnaldrende som oppfyller forespørsler til den. Så lenge en enkelt jevnaldrende i gruppen leverer tjenesten, er tjenesten tilgjengelig. Hver jevnaldrende er medlem av verdens jevnaldrende gruppe og også, typisk, netto jevnaldrende gruppe, og kan velge å bli med og forlate andre grupper etter eget ønske. Hva er motivasjonen for å opprette jevnaldrende grupper? Her er noen grunner:

  • Opprettholde sikker region: Hvis du har en sikker jevnaldringsgruppe, trenger ikke jevnaldrende i gruppen å avsløre sin kritiske informasjon.
  • Gi vanlige tjenester: Vanligvis vil mange jevnaldrende ønske å bruke / tilby de samme tjenestene som andre jevnaldrende, så det er fornuftig å gjøre det i gruppen. For eksempel kan du tilby en skriver eller en distribuert databasetjeneste til alle jevnaldrende i gruppen.
  • Begrens ID-omfang: Rørnavn samsvares med gruppen de er opprettet i. Hvis to rør har samme navn, men ikke ble opprettet i samme gruppe, er det ingen problemer med å adressere dem.

La oss undersøke hvordan vi kan opprette og bli med i en kollega. Metodene som tilbys av PeerGroup grensesnittet er oppført nedenfor.

  • newGroup (Annonse pgAdv): brukes vanligvis til å starte en gruppe som allerede eksisterer med den oppdagede gruppeannonsen
  • newGroup (PeerGroupID gid, Advertising impl, Strengnavn, Strengbeskrivelse): brukes vanligvis til å konstruere nye jevnaldrende grupper
  • newGroup (PeerGroupID gid): brukes til å instansiere en eksisterende og publisert jevnaldringsgruppe med bare jevnaldrende gruppe-ID (gid)

Opprette jevnaldrende grupper

Å lage en grunnleggende jevnaldringsgruppe er relativt grei. La oss se på noen kode:

prøv {// Vi oppretter en ny gruppe basert på netPeerGroup, så la oss kopiere // impl-annonsen og endre den. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement (); myPeerGroup = netPeerGroup.newGroup (null, // Opprett en ny gruppe-ID for denne gruppen. implAdv, // Bruk ovennevnte annonse. "Group name", // Dette er navnet på gruppen. "Group description" // This er beskrivelsen av gruppen.);

System.out.println ("--- Peer-gruppe opprettet vellykket, id:" + myPeerGroup.getPeerGroupAdvertisement (). GetID ()); // Nå som gruppen er opprettet, blir den automatisk publisert og lagret lokalt, // men vi må publisere den eksternt slik at andre jevnaldrende kan oppdage den. discoveryService.remotePublish (myPeerGroup.getPeerGroupAdvertisement ()); System.out.println ("--- Publisert ekstern annonsering fra jevnaldrende"); } catch (Unntak e) {System.out.println ("Det oppstod en feil"); e.printStackTrace (); }

Oppfordringen til newGroup () oppretter og publiserer gruppen til den lokale hurtigbufferen. Mest sannsynlig vil du publisere denne annonsen til andre jevnaldrende når du oppretter den, noe du kan gjøre ved å ringe remotePublish (). Denne metoden vil skyve reklamegruppeannonsen til andre jevnaldrende. Hvis du trenger å sørge for at du sender reklamen til jevnaldrende på et annet delnett, må du forsikre deg om at du er koblet til en møteorganisasjon. For å gjøre dette, bruk følgende kode, forutsatt at din møteorganisasjon er oppe og konfigurert riktig:

private void connectToRdv (PeerGroup peerGroup) {if (rdv == null) {// Få rdv-tjenesten rdv = peerGroup.getRendezVousService (); } // Sørg for at vi er koblet til før du fortsetter mens (! Rdv.isConnectedToRendezVous ()) {prøv {Thread.sleep (5000); } fange (InterruptedException e1) {System.out.println ("rdv connect avbrutt"); e1.printStackTrace (); }}} 

Bli med i jevnaldrende grupper

Det kan være vanskeligere å bli med i en likemannsgruppe enn å opprette en. Selv om vi har en usikret likemannsgruppe, må vi fremdeles opprette legitimasjon, tomme legitimasjon og sende disse legitimasjonene til den likemannsgruppen vi prøver å bli med på.

Siden vi har en peer group-reklame, må vi opprette alle legitimasjonene som er nødvendige og bli med i gruppen. Før vi ser på bli med i gruppe() metode, la oss se på en av klassene den bruker, MembershipService klasse. Det er tre metoder i MembershipService som vi er interessert i, spesifikt søke om(), bli med(), og si opp(). Vi passerer til søke om() metoden ønsket type autentisering, og hvis den typen støttes, returnerer den til oss en Authenticator. Vi bruker dette Authenticator å faktisk bli med i gruppen. Vi sender det som et argument til bli med() metode, og den verifiserer legitimasjonen vår. Når en jevnaldrende ønsker å forlate en gruppe, blir samtalen til si opp() letter dette.

La oss nå se på bli med i gruppe() metode:

private void joinGroup () {// Forutsatt at myPeerGroup har blitt instantiert // før du kaller denne metoden. System.out.println ("Prøver å bli med i kollegagruppen"); prøv {// Opprett dokumentet som vil identifisere denne kollegaen. StructuredDocument identityInfo = null; // Ingen identitetsinformasjon kreves for gruppen vår.

AuthenticationCredential authCred = new AuthenticationCredential (myPeerGroup, // Peer group at den er opprettet i null, // autentiseringsmetode.); MembershipService membershipService = myPeerGroup.getMembershipService (); Authenticator auth = membershipService.apply (authCred); // Se om gruppen er klar til å bli med. // Authenticator gjør for øyeblikket ikke noe skille mellom // mislykket og uferdig autentisering. hvis (auth.isReadyForJoin ()) {Credential myCred = membershipService.join (auth); System.out.println ("Ble med i minPeerGroup"); System.out.println ("Gruppe-id:" + myPeerGroup.getPeerGroupID ()); } annet {System.out.println ("Kan ikke bli med i gruppen"); }} fange (Unntak e) {System.out.println ("Det oppstod en feil"); e.printStackTrace (); }}

Nå som vi har blitt med i gruppen, kan vi benytte oss av jevnaldrende gruppetjenester og sende meldinger til medlemmene. Når du utvikler P2P-applikasjoner, vil det på sikt hjelpe deg å tenke på hvor du vil ha grensene for jevnaldrende grupper på forhånd. Husk at gruppegrenser kan strekke seg over mange nettverk.

Sammenføyningsprosessen kan virke skremmende i begynnelsen, men den er ganske grei når du gjør det et par ganger. Nå er det mulig å bruke mange forskjellige metoder for å sikre en jevnaldrende gruppe - kompleksiteten i tilknytningsprosessen avhenger av hvilken type autentisering du ønsker. Jeg diskuterer ikke disse metodene her.

Rør

Som forklart tidligere er et rør en virtuell kommunikasjonskanal mellom to jevnaldrende. Rør kan være forvirrende for nybegynnere fordi nybegynnere prøver å knytte dem til det de allerede vet - stikkontakter. Mens jeg diskuterer rør, må du huske at de er mye mer abstrakte enn stikkontakter.

I den mest grunnleggende formen er det to typer rør; inngangsrør og utgangsrør. Applikasjoner bruker inngangsrør for å motta informasjon, og utgangsrør for å sende informasjon. Rør kan brukes i to adresseringsmodi:

  • Unicast-rør (punkt-til-punkt): Disse rørene kobler ett utgangsrør til et enkelt inngangsrør, men et enkelt inngangsrør kan motta meldinger fra forskjellige utgangsrør
  • Forplant rør: Disse rørene kobler et enkelt utgangsrør til mange forskjellige inngangsrør

Rør er et upålitelig, ensrettet og asynkront kommunikasjonsmiddel. Beefed-up implementeringer av rør er tilgjengelige som gir pålitelighet, toveis evner og sikker transitt.

For å lage et rør må du først lage en rørannonse og publisere det. Deretter må du hente rørtjenesten fra likemannsgruppen og bruke den til å lage røret. Hvert rør har en rør-ID tilknyttet, som brukes til å adressere røret.

For å opprette en ny rør-ID bruker vi IDFactory i net.jxta.id pakke. Her er et eksempel på hvordan du oppretter og skriver ut ID:

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

Merk:peerGroup er den likemannsgruppen som du vil lage røret for.

Så to jevnaldrende kan kommunisere med hverandre, de må vite rør-ID-ene for rørene de ønsker å kommunisere med. Det er noen måter å sikre at de begge kjenner denne informasjonen:

  • Begge jevnaldrende leser i samme rørannonse fra en fil
  • Rør-ID er hardkodet i applikasjonene
  • Publiser og oppdag rør-ID-en ved kjøretid
  • Rør-ID genereres fra en kjent ID
$config[zx-auto] not found$config[zx-overlay] not found