ピアツーピアアプリケーションが簡単に

ピアツーピア(P2P)ファイル共有アプリケーションであるKazaaは、他のどのアプリケーションよりも多くのネットワークトラフィックを引き起こすと言われています。Kazaa Webサイトには、3億8500万回以上のダウンロードがあったと記載されています。比較のために、Download.comのトップダウンロードを表示しました。これは、Ad Awareを最も人気のあるダウンロードとしてリストしており、ダウンロード数はわずか117,000,000です。Download.comの上位25のダウンロードから、11のP2Pアプリケーションを認識しました。これらの観察だけから、P2Pアプリケーションの人気は明らかに高まっています。しかし、ファイル共有はP2Pアプリケーションの唯一のタイプではありません。典型的なインスタントメッセージングアプリケーションの操作のほとんどはP2Pです。他の例は、フォーラムや分散データベースです。そして、リストは増え続けています。

このようなP2Pアプリケーションを作成するには、他のピアを検出して対話するための手段が必要です。P2Pアプリケーションの作成に伴う問題のほとんどは、ピアのネットワークの維持、メッセージのフォーマットと受け渡し、他のピアの検出、およびその他の同様の問題に関連しています。Project JxtaとそのJavaバインディングは、アプリケーションのこれらの側面を処理します。Jxtaを使用することで、一般的なP2Pの問題ではなく、アプリケーションに集中できます。

Jxtaは、juxtaposeという単語の短縮版ですこれは並べて意味します。 Jxtaプログラマーズガイドでは、Jxtaを「P2Pコンピューティング用に設計されたオープンコンピューティングプラットフォーム」と定義しています。これは、プラットフォームにもプログラミング言語にも固有ではありません。これはSunMicrosystemsで考案され、維持および成長するためにオープンソースコミュニティにリリースされました。そのリリースとともに、最初のJava実装が発行されました。この記事では、Java環境でJxtaを使用する方法について説明するときに、その実装に焦点を当てます。また、Javaで実装されたJxtaアプリケーションの最も一般的な6つの操作について説明し、独自のP2Pアプリケーションの作成を開始するために必要なツールを紹介します。この記事を読んだ後、P2Pアプリケーションを作成することがいかに簡単でエキサイティングであるかを理解していただければ幸いです。 P2Pアプリケーションは、人気だけでなく多様性においても成長し続けます。そして明日の開発者は、最先端を維持するために、今日これらのテクノロジーを学び始める必要があります。

JavaとJxta

Jxtaを使用するための最初のステップは、Jxtaダウンロードページからダウンロードすることです。ほとんどの読者が同意するように、オープンソースプロジェクトの取得と使用のための構成が難しい場合があります。Jxtaは、ダウンロードと使用が非常に簡単な優れたオープンソースプロジェクトの一例です。苦労していて、Jxtaのダウンロードと使用に関する詳細情報が必要な場合は、Jxtaプログラマーズガイドを参照してください。

新しいディレクトリからJxta対応アプリケーションを最初に実行すると、GUIコンフィギュレータが提供されます。

ピアとは正確には何ですか?Daniel Brookshire(有名なJxtaコミッターであり、いわゆる「チャンピオン」)によると、これは「仮想通信ポイント」であり、同じデバイス上で異なるピアを実行できます。デバイスはPCに限定されません。それは、携帯電話、サーバー、またはセンサーのような単純なアイテムでさえあり得ます。特別なピアがあります。注意する必要があるのは、ランデブーリレーの2つですランデブーピアを使用すると、ピアはローカルサブネットのスコープ外で通信でき、リレーピアはファイアウォールを介して情報を中継するために使用されます。

「Jxtaの使用コスト」(IEEEComputer Society、2003年9月)で定義されている、最も一般的な6つのJxtaアプリケーション操作について説明することから始めましょう。それらは、通常発生する順序で以下にリストされています。

  1. Jxtaの起動:Jxtaの起動は非常に簡単で、数行のコードの問題です。
  2. ピアグループへの参加:ピアグループは、グループ化された共通の関心のセットを持つピアのセットです。この記事では、既存のピアグループへの参加と新しいピアグループの作成について説明します。
  3. 広告の公開:簡単に言うと、広告はJxtaのすべてです。Jxtaはアドバタイズメントを使用して、プラットフォームに依存しない方法でピア、ピアグループ、およびその他のリソースを検出します。この記事の後半で、新しい広告の読み取り、作成、および送信について説明します。
  4. 入力パイプを開く:パイプは、ピアが相互に通信するために使用する1つのメカニズムです。パイプは「仮想通信チャネル」であり、パイプユーザーは他のピアの実際のアドレスを知らないという点で仮想です。パイプに関するこの記事のセクションでは、パイプを使用してメッセージを送信する方法について説明します。
  5. 他のピアリソースの発見:他のピアと通信する前に、まずいくつかを見つける必要があります。これについても説明します。
  6. 出力パイプを開く:出力パイプは、他のピアにメッセージを送信するために使用されます。出力パイプには、ポイントツーポイント( 1対1)と伝播( 1対多)の2つのクラスがあります。

この記事がどこに行くのかがわかったので、旅を始めましょう。

ピアグループ

ピアグループは、いくつかの共通の関心を持つピアの集まりです。ピアグループは、ピアと同様にサービスを提供できますが、ピアグループサービスは、要求を満たす特定のピアに必ずしも依存しているわけではありません。グループ内の単一のピアがサービスを提供している限り、サービスは利用可能です。すべてのピアは、ワールドピアグループのメンバーであり、通常はネットピアグループのメンバーであり他のグループに自由に参加および離脱することを選択できます。ピアグループを作成する動機は何ですか?ここにいくつかの理由があります:

  • 安全な地域を維持する:安全なピアグループがある場合、グループ内のピアは重要な情報を公開する必要はありません。
  • 共通のサービスを提供する:通常、多くのピアは他のピアと同じサービスを使用/提供したいので、グループ内でそうすることは理にかなっています。たとえば、グループ内のすべてのピアにプリンタまたは分散データベースサービスを提供できます。
  • 制限IDスコープ:パイプ名は、それらが作成されたグループと一致します。2つのパイプが同じ名前であるが、同じグループで作成されていない場合、それらのアドレス指定に問題はありません。

ピアグループを作成して参加する方法を調べてみましょう。PeerGroupインターフェイスによって提供されるメソッドを以下に示します。

  • newGroup(Advertisement pgAdv):通常、検出されたグループアドバタイズメントですでに存在するグループをインスタンス化するために使用されます
  • newGroup(PeerGroupID gid, Advertisement impl, String name, String description):通常、新しいピアグループを構築するために使用されます
  • newGroup(PeerGroupID gid):ピアグループIDのみを使用して既存の公開されたピアグループをインスタンス化するために使用されます(gid

ピアグループの作成

基本的なピアグループの作成は比較的簡単です。いくつかのコードを見てみましょう:

try { //We will create a new group based on the netPeerGroup so let's copy its //impl advertisement and modify it. ModuleImplAdvertisement implAdv = netPeerGroup.getAllPurposePeerGroupImplAdvertisement(); myPeerGroup = netPeerGroup.newGroup( null, //Create a new group id for this group. implAdv, //Use the above advertisement. "Group name", //This is the name of the group. "Group description" //This is the description of the group. );

System.out.println("---Peer group created successfully, id: " + myPeerGroup.getPeerGroupAdvertisement().getID() ); //Now that the group is created, it is automatically published and stored locally, //but we need to publish it remotely so other peers can discover it. discoveryService.remotePublish( myPeerGroup.getPeerGroupAdvertisement() ); System.out.println("---Published peer group advertisement remotely"); } catch (Exception e) { System.out.println("An error occurred"); e.printStackTrace(); }

の呼び出しnewGroup()により、グループが作成され、ローカルキャッシュに公開されます。ほとんどの場合、このアドバタイズメントを作成するときに他のピアに公開することをお勧めしますremotePublish()。これは、を呼び出すことで実行できます。このメソッドは、ピアグループアドバタイズメントを他のピアにプッシュします。アドバタイズメントを別のサブネット上のピアに送信する必要がある場合は、ランデブーピアに接続していることを確認する必要があります。これを行うには、ランデブーピアが起動して正しく構成されていることを前提として、次のコードを使用します。

private void connectToRdv(PeerGroup peerGroup) { if( rdv == null) { //Get the rdv service rdv = peerGroup.getRendezVousService(); } //Make sure that we are connected before proceeding while( !rdv.isConnectedToRendezVous() ) { try { Thread.sleep(5000); } catch (InterruptedException e1) { System.out.println("rdv connect interrupted"); e1.printStackTrace(); } } } 

ピアグループへの参加

ピアグループへの参加は、実際に作成するよりも難しい場合があります。保護されていないピアグループがある場合でも、資格情報を作成し、資格情報を空にして、参加しようとしているピアグループにこれらの資格情報を送信する必要があります。

ピアグループアドバタイズメントがあるため、必要なすべての資格情報を作成してグループに参加する必要があります。joinGroup()メソッドを見る前に、メソッドが使用するクラスの1つであるクラスを見てみましょうMembershipServiceMembershipService関心のある方法は3つあります。具体的apply()join()は、、、resign()です。apply()必要な認証のタイプをメソッドに渡し、そのタイプがサポートされている場合は、を返しますAuthenticator。これを使っAuthenticatorて実際にグループに参加します。これを引数としてjoin()メソッドに渡し、資格情報を検証します。ピアがグループを離れたい場合は、を呼び出すとresign()これが容易になります。

それでは、joinGroup()メソッドを見てみましょう。

private void joinGroup() { //Assuming myPeerGroup has been instantiated //before calling this method. System.out.println("Trying to join the peer group"); try { //Create the document that will identity this peer. StructuredDocument identityInfo = null; //No identity information required for our group.

AuthenticationCredential authCred = new AuthenticationCredential( myPeerGroup, //Peer group that it is created in null, //authentication method. ); MembershipService membershipService = myPeerGroup.getMembershipService(); Authenticator auth = membershipService.apply(authCred); //See if the group is ready to be joined. //Authenticator currently makes no distinction between //failed and unfinished authentication. if( auth.isReadyForJoin() ) { Credential myCred = membershipService.join(auth); System.out.println("Joined myPeerGroup"); System.out.println("Group id: " + myPeerGroup.getPeerGroupID() ); } else { System.out.println("Unable to join the group"); } } catch (Exception e) { System.out.println("An error occurred"); e.printStackTrace(); } }

Now that we have successfully joined the group, we are able to employ provided peer group services and send messages to the members. When developing P2P applications, thinking about where you want your peer group boundaries ahead of time will assist you in the long run. Keep in mind that peer group boundaries can span many networks.

The joining process can seem daunting at first, but it is pretty straightforward once you do it a few times. Now it is possible to employ many different methods to secure a peer group—the complexity of the joining process depends on the type of authentication desired. I do not discuss these methods here.

Pipes

As explained earlier, a pipe is a virtual channel of communication between two peers. Pipes can be confusing for beginners because newbies try to relate them to what they already know—sockets. While I discuss pipes, keep in mind that they are much more abstract then sockets.

In the most basic form, there are two types of pipes; input pipes and output pipes. Applications use input pipes to receive information, and output pipes, to send information. Pipes can be used in two addressing modes:

  • Unicast (point-to-point) pipes: These pipes connect one output pipe to a single input pipe, but a single input pipe can receive messages from different output pipes
  • Propagate pipes: These pipes connect a single output pipe to many different input pipes

Pipes are an unreliable, unidirectional, and asynchronous means of communication. Beefed-up implementations of pipes are available that provide reliability, bidirectional capabilities, and secure transit.

To create a pipe, first you must create a pipe advertisement and publish it. Then you need to get the pipe service from the peer group and use it to create the pipe. Each pipe has a pipe ID associated with it, which is used to address the pipe.

To create a new pipe ID, we use the IDFactory in the net.jxta.id package. Here is a sample of how to create and print the ID:

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

Note:peerGroup is the peer group for which you want to create the pipe.

したがって、2つのピアは相互に通信できるため、通信するパイプのパイプIDを知っている必要があります。両方がこの情報を知っていることを確認する方法はいくつかあります。

  • 両方のピアがファイルから同じパイプアドバタイズメントを読み込みます
  • パイプIDはアプリケーションにハードコードされています
  • 実行時にパイプIDを公開および検出します
  • パイプIDは既知のIDから生成されます