Programování

Snadné aplikace typu peer-to-peer

Bylo řečeno, že Kazaa, aplikace pro sdílení souborů peer-to-peer (P2P), způsobuje větší síťový provoz než jakákoli jiná aplikace. Web Kazaa uvádí, že má více než 385 000 000 stažení! Pro srovnání jsem si prohlédl hlavní stahování Download.com, která uvádí Ad Aware jako nejoblíbenější stahování, s pouhými 117 000 000 staženími. Z 25 nejlepších stahování z webu Download.com jsem poznal 11 aplikací P2P. Pouze z těchto pozorování je zřejmé, že aplikace P2P očividně rostou v popularitě. Sdílení souborů však není jediným typem aplikace P2P. Většina operací typické aplikace pro rychlé zasílání zpráv je P2P. Dalšími příklady jsou fóra a distribuované databáze. A seznam stále roste.

Chcete-li vytvářet aplikace P2P, jako jsou tyto, musíte mít prostředky pro objevování a interakci s ostatními vrstevníky. Většina potíží při vytváření aplikací P2P souvisí s udržováním sítě peerů, formátováním a předáváním zpráv, objevováním dalších peerů a dalšími podobnými problémy. Project Jxta a jeho vazba Java zpracovávají tyto aspekty vaší aplikace. Pomocí Jxta se můžete soustředit na svou aplikaci, ne na obecné problémy P2P.

Jxta je zkrácená verze slova juxtapose, což znamená bok po boku. Příručka programátora Jxta definuje Jxta jako „otevřenou výpočetní platformu určenou pro výpočet P2P“. Není specifická ani pro žádnou platformu, ani pro žádný programovací jazyk. Byl vytvořen ve společnosti Sun Microsystems a byl vydán komunitě open source, aby se udržel a rostl. Spolu s jeho vydáním byla vydána počáteční implementace Java. Na tuto implementaci se zaměřuji v tomto článku, když diskutuji o tom, jak používat Jxta v prostředí Java. Rovněž pojednávám o šesti nejběžnějších operacích aplikací Jxta implementovaných v Javě a představuji nástroje, které potřebujete, abyste mohli začít psát své vlastní aplikace P2P. Po přečtení tohoto článku doufám, že jste si uvědomili, jak snadné a vzrušující může být vytváření aplikací P2P. Aplikace P2P budou i nadále růst nejen v popularitě, ale také v rozmanitosti a vývojáři zítřka se dnes musí začít tyto technologie učit, aby zůstali na špici.

Java a Jxta

Prvním krokem k použití Jxta je jeho stažení ze stránky ke stažení Jxta. Jak bude většina čtenářů souhlasit, někdy může být obtížné získat a nakonfigurovat pro použití projekty open source. Jxta je příkladem skvělého open source projektu, který také je velmi snadné stažení a okamžité použití. Pokud máte potíže a potřebujete více informací o stahování a používání Jxta, podívejte se do Příručky programátora Jxta.

Při prvním spuštění aplikace podporující Jxta z nového adresáře vám bude poskytnut konfigurátor GUI.

Co přesně je peer? Podle Daniela Brookshireho (známého účastníka Jxty a takzvaného „šampiona“) jde o „virtuální komunikační bod“, kde mohou na stejném zařízení běžet různí vrstevníci. Zařízení není omezeno na PC; může to být mobilní telefon, server nebo dokonce tak jednoduchá položka jako senzor. Existují speciální vrstevníci, ti dva, kterých si musíme být vědomi, jsou setkání a relé. Setkávací peer umožňuje peerům komunikovat mimo rozsah místní podsítě a relační peer se používá k přenosu informací prostřednictvím bran firewall.

Začněme tím, že projdeme šest nejběžnějších operací aplikace Jxta, jak jsou definovány v části „Náklady na používání Jxta“ (IEEE Computer Society, září 2003). Níže jsou uvedeny v pořadí, v jakém se obvykle vyskytují.

  1. Spuštění Jxta: Spuštění Jxta je velmi jednoduché a jednoduše otázkou několika řádků kódu.
  2. Připojení k vrstevnické skupině: Skupina vrstevníků je skupina vrstevníků, kteří mají společnou skupinu zájmů, které byly seskupeny dohromady. V tomto článku se věnuji připojení se ke stávajícím skupinám vrstevníků a vytváření nových.
  3. Zveřejnění inzerátů: Jednoduše řečeno, reklamy jsou to, o čem Jxta je. Jxta používá reklamu k objevování vrstevníků, skupin vrstevníků a dalších zdrojů způsobem nezávislým na platformě. O čtení, tvorbě a zasílání nových reklam pojednávám dále v tomto článku.
  4. Otevření vstupního potrubí: Trubka je jeden mechanismus, který vrstevníci používají ke vzájemné komunikaci. Trubky jsou „virtuální komunikace kanály„—Virtuální v tomto kanálu uživatelé neznají skutečnou adresu druhého partnera. Diskutuji o použití kanálu k odesílání zpráv v části tohoto článku o kanálu.
  5. Objevování dalších zdrojů peer: Než budete moci komunikovat s ostatními vrstevníky, musíte nejprve najít nějaké, o kterých budu také diskutovat.
  6. Otevření výstupního potrubí: Výstupní kanály se používají k odesílání zpráv jiným kolegům. Existují dvě třídy výstupních kanálů: bod-bod, nebo one-to-one, a propagace, nebo jedna k mnoha.

Nyní, když víte, kam vás tento článek zavede, pojďme začít naši cestu.

Skupiny vrstevníků

Skupiny vrstevníků jsou jednoduše sbírkou vrstevníků s určitým souborem společných zájmů. Skupiny typu peer, stejně jako partneři, mohou poskytovat služby, ale služba typu peer-group není nutně závislá na konkrétním partnerovi, který na ni splňuje požadavky. Pokud službu poskytuje jeden vrstevník ve skupině, je služba k dispozici. Každý vrstevník je členem světová skupina vrstevníků a také typicky čistá skupina peer, a mohou se rozhodnout připojit a nechat jiné skupiny podle libosti. Jaká je motivace pro vytváření skupin vrstevníků? Tady je několik důvodů:

  • Udržovat zabezpečený region: Pokud máte zabezpečenou skupinu vrstevníků, vrstevníci ve skupině nemusí vystavovat své kritické informace.
  • Poskytovat běžné služby: Mnoho kolegů bude obvykle chtít používat / poskytovat stejné služby jako ostatní kolegové, takže to ve skupině dává smysl. Můžete například poskytnout tiskárnu nebo službu distribuované databáze všem vrstevníkům ve skupině.
  • Rozsah ID omezení: Názvy kanálů se shodují se skupinou, ve které jsou vytvořeny. Pokud mají dva kanály stejný název, ale nebyly vytvořeny ve stejné skupině, nejsou problémy s jejich adresováním.

Podívejme se, jak můžeme vytvořit a připojit se ke skupině vrstevníků. Metody poskytované PeerGroup rozhraní jsou uvedeny níže.

  • newGroup (reklama pgAdv): obvykle se používá pro vytvoření instance skupiny, která již existuje u objevené skupinové reklamy
  • newGroup (PeerGroupID gid, reklama impl, název řetězce, popis řetězce): obvykle se používá k vytváření nových skupin vrstevníků
  • newGroup (PeerGroupID gid): slouží k vytvoření instance existující a publikované skupiny peer pouze s ID skupiny peer (gid)

Vytváření partnerských skupin

Vytvoření základní skupiny vrstevníků je poměrně jednoduché. Podívejme se na nějaký kód:

zkuste {// Vytvoříme novou skupinu založenou na netPeerGroup, tak zkopírujme její // impl reklamu a upravme ji. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement (); myPeerGroup = netPeerGroup.newGroup (null, // Vytvořit nové ID skupiny pro tuto skupinu. implAdv, // Použijte výše uvedený inzerát. „Název skupiny“, // Toto je název skupiny. „Popis skupiny“ // Toto je popis skupiny.);

System.out.println ("--- Skupina peer byla úspěšně vytvořena, id:" + myPeerGroup.getPeerGroupAdvertisement (). GetID ()); // Nyní, když je skupina vytvořena, je automaticky publikována a uložena lokálně, // ale musíme ji publikovat vzdáleně, aby ji mohli objevit ostatní vrstevníci. discoveryService.remotePublish (myPeerGroup.getPeerGroupAdvertisement ()); System.out.println ("--- Vzdáleně publikovaná skupinová reklama"); } catch (Výjimka e) {System.out.println ("Došlo k chybě"); e.printStackTrace (); }

Volání na nová skupina() vytvoří a publikuje skupinu do místní mezipaměti. S největší pravděpodobností budete chtít tuto reklamu publikovat jiným vrstevníkům, až ji vytvoříte, což můžete provést voláním remotePublish (). Tato metoda přenese inzerát skupiny peer na jiné partnery. Pokud se potřebujete ujistit, že odesíláte inzeráty kolegům v jiné podsíti, musíte se ujistit, že jste připojeni k partnerskému setkání. Chcete-li to provést, použijte následující kód, za předpokladu, že je váš partner na schůzce připraven a správně nakonfigurován:

private void connectToRdv (PeerGroup peerGroup) {if (rdv == null) {// Získejte službu rdv rdv = peerGroup.getRendezVousService (); } // Před pokračováním se ujistěte, že jsme připojeni while (! Rdv.isConnectedToRendezVous ()) {try {Thread.sleep (5000); } catch (InterruptedException e1) {System.out.println ("rdv připojení přerušeno"); e1.printStackTrace (); }}} 

Připojování ke skupinám peer

Připojit se ke skupině vrstevníků může být obtížnější, než je skutečně vytvořit. I když máme nezajištěnou skupinu peer, stále musíme vytvořit přihlašovací údaje, prázdné přihlašovací údaje a odeslat tato pověření do skupiny peer, ke které se pokoušíme připojit.

Vzhledem k tomu, že máme vzájemnou skupinovou reklamu, musíme vytvořit všechna potřebná pověření a připojit se ke skupině. Než se podíváme na přidat se ke skupině() metoda, pojďme se podívat na jednu z tříd, které používá, na Služba členství třída. V systému existují tři metody Služba členství konkrétně nás zajímá aplikovat(), připojit(), a odstoupit(). Přejdeme k aplikovat() metoda požadovaný typ autentizace, a pokud je tento typ podporován, vrátí se nám Authenticator. Používáme to Authenticator ve skutečnosti se připojit ke skupině. Předáváme to jako argument připojit() a ověřuje naše pověření. Když chce peer opustit skupinu, volání na odstoupit() usnadňuje to.

Nyní se podívejme na přidat se ke skupině() metoda:

private void joinGroup () {// Za předpokladu, že byla vytvořena instance myPeerGroup // před voláním této metody. System.out.println ("Pokus o připojení ke skupině vrstevníků"); zkuste {// Vytvořit dokument, který bude identifikovat tohoto partnera. StructuredDocument identityInfo = null; // Pro naši skupinu nejsou vyžadovány žádné informace o totožnosti.

AuthenticationCredential authCred = new AuthenticationCredential (myPeerGroup, // Peer group that it is created in null, // authentication method.); MembershipService membershipService = myPeerGroup.getMembershipService (); Authenticator auth = membershipService.apply (authCred); // Zjistěte, zda je skupina připravena k připojení. // Authenticator aktuálně nerozlišuje mezi // neúspěšným a nedokončeným ověřením. if (auth.isReadyForJoin ()) {Credential myCred = membershipService.join (auth); System.out.println ("Připojil se k méPeerGroup"); System.out.println ("ID skupiny:" + myPeerGroup.getPeerGroupID ()); } else {System.out.println ("Nelze se připojit ke skupině"); }} catch (Výjimka e) {System.out.println ("Došlo k chybě"); e.printStackTrace (); }}

Nyní, když jsme se úspěšně připojili ke skupině, jsme schopni zaměstnat poskytované služby skupiny peer a posílat zprávy členům. Při vývoji aplikací P2P vám z dlouhodobého hlediska pomůže přemýšlení o tom, kde chcete, aby vaše hranice skupiny vrstevníků byly předem. Mějte na paměti, že hranice skupin peerů mohou zahrnovat mnoho sítí.

Proces připojení se může zpočátku zdát skličující, ale je to docela jednoduché, jakmile to uděláte několikrát. Nyní je možné k zabezpečení partnerské skupiny použít mnoho různých metod - složitost procesu připojení závisí na požadovaném typu autentizace. Nebudu zde diskutovat o těchto metodách.

Trubky

Jak již bylo vysvětleno dříve, kanál je virtuální komunikační kanál mezi dvěma vrstevníky. Trubky mohou být pro začátečníky matoucí, protože nováčci se je snaží spojit s tím, co už znají - zásuvky. Zatímco diskutuji o trubkách, mějte na paměti, že jsou mnohem abstraktnější než zásuvky.

V nejzákladnější formě existují dva typy trubek; vstupní potrubí a výstupní potrubí. Aplikace používají vstupní kanály k přijímání informací a výstupní kanály k odesílání informací. Trubky lze použít ve dvou režimech adresování:

  • Unicast (point-to-point) potrubí: Tyto kanály spojují jedno výstupní potrubí s jedním vstupním kanálem, ale jeden vstupní kanál může přijímat zprávy z různých výstupních kanálů
  • Propagujte trubky: Tyto potrubí spojují jedno výstupní potrubí s mnoha různými vstupními potrubími

Potrubí je nespolehlivý, jednosměrný a asynchronní komunikační prostředek. K dispozici jsou vylepšené implementace potrubí, které poskytují spolehlivost, obousměrné schopnosti a bezpečný přenos.

Chcete-li vytvořit kanál, musíte nejprve vytvořit reklamu na potrubí a publikovat ji. Pak musíte získat službu kanálu od skupiny peer a použít ji k vytvoření kanálu. Ke každému kanálu je přidruženo ID kanálu, které se používá k adresování kanálu.

K vytvoření nového ID potrubí použijeme IDFactory v net.jxta.id balík. Zde je ukázka, jak vytvořit a vytisknout ID:

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

Poznámka:peerGroup je skupina peer, pro kterou chcete vytvořit kanál.

Takže dva vrstevníci mohou spolu komunikovat, musí znát ID potrubí pro kanály, se kterými chtějí komunikovat. Existuje několik způsobů, jak zajistit, aby oba tyto informace znali:

  • Oba vrstevníci čtou ve stejné reklamě na potrubí ze souboru
  • ID kanálu je pevně zakódováno do aplikací
  • Publikujte a objevte ID kanálu za běhu
  • ID potrubí je generováno ze známého ID
$config[zx-auto] not found$config[zx-overlay] not found