レベル: 初級 Todd Sundsted, Principal architect, Gig.com
2001年 5月 01日 ピアツーピア (P2P) コンピューティングの技術的な側面を理解するための最善の方法は、実際のP2Pアプリケーションを実行してみることです。Todd Sundstedは、今月、P2Pアプリケーションの案内をします。アプリケーションをインストールする方法、構成する方法、およびアプリケーションの機能の仕組みについて説明します。
P2Pコンピューティングのツアーが終わるまであと一つの項目を残すだけですから、少し回り道をしましょう。「ピアツーピア・コンピューティングの実践: 序論と歴史」に対する読者からのフィードバックによって分かったことなのですが、このP2Pアプリケーションを使用したり理解したりすることに興味を持っている人は、私が予想していた以上に多いようです。当初このアプリケーションのことを「便利な道具箱」、つまり本文で述べられているポイントを説明する例を引き出すためもの程度として考えていました。読者の中には、より詳しい情報を必要としている人もいることが分かりましたので、今月はそうした詳しい情報を提供することにします。
地上数百メートルの高度を維持してセキュリティーの問題を論じる代わりに、今月は、十数メートルに高度を下げて、アプリケーション・フレームワークについてご案内します。
この「回り道」が、実際の生活で頻繁に出会う回り道よりも楽しい結果になることを心から願っています。
インストールと実行
インストールの基本から始めましょう。先月、このP2Pアプリケーションの開始にややてこずった読者が何人かいたようですので、アプリケーションの開始プロセスを少し変更しました。
このP2Pアプリケーションを実行する前に、p2p.jarとspp.jarの2つのjarファイルと構成ファイルapp.propertiesをダウンロードする必要があります (参考文献を参照)。p2p.jarファイルには、このP2Pアプリケーション自体のためのクラス・ファイルが含まれています。spp.jarファイルには、このP2Pアプリケーションによって使用されるメッセージング・ライブラリーのためのクラス・ファイルが含まれています。
これらのファイルをダウンロードした後で、両方のファイルと、構成ファイルを含むディレクトリーを、classpathに追加してください。
Windowsを実行していて、2つのjarファイルと構成ファイルをディレクトリーc:\p2pにダウンロードした場合には、classpathを次のように設定してください。
set CLASSPATH=c:\p2p\p2p.jar;c:\p2p\spp.jar;c:\p2p
|
Linux、Solaris、または何らかの適切なUNIX変種を実行していて、2つのjarファイルと構成ファイルをディレクトリー /home/foo/p2pにダウンロードした場合には、classpathを次のように設定してください。
export CLASSPATH=/home/foo/p2p/p2p.jar:/home/foo/p2p/spp.jar:/home/foo/p2p
|
(上記のコマンドは、コマンド・シェルとしてBASHを実行していることを前提としたものです。CSHなど他の一般的なシェルで環境変数を設定する方法については、ユーザー自身に方法をお任せします。)
classpathを設定した後で、次のコマンドを使用してアプリケーションを開始してください。
java com.etcee.app.ki.Main
|
P2Pアプリケーションが、手が込んだ情報バナーとコマンド・プロンプトで迎えてくれます。
最後に注をひとつ: 私のP2Pアプリケーションには、Java 2プラットフォームが絶対に必要です。
構成ファイル
前のステップによってP2Pアプリケーションが立ち上がりますが、これを役に立つように使用するには、その前に構成ファイルを編集しなければなりません。構成ファイルでは、P2Pアプリケーションが使用するポート、このアプリケーションが制御するリソースおよびこのアプリケーションが認識するピアを定義します。リスト1にそれぞれの定義を示します。
リスト1. 構成ファイルの例
com.etcee.app.ki.port=7777
com.etcee.app.ki.resource.0.name=share
com.etcee.app.ki.resource.0.class=com.etcee.app.ki.resource.file.FileResource
com.etcee.app.ki.resource.0.arg0=/home/foo/share
com.etcee.app.ki.resource.1.name=tmp
com.etcee.app.ki.resource.1.class=com.etcee.app.ki.resource.file.FileResource
com.etcee.app.ki.resource.1.arg0=/tmp
com.etcee.app.ki.peer.0=bass:7777
com.etcee.app.ki.peer.1=salmon:7777
com.etcee.app.ki.peer.2=perch:7777
com.etcee.app.ki.peer.3=guppy:7777
|
一行からなる最初のセクションでは、他のピアからの接続を受け入れるためにP2Pアプリケーションが使用するポートを定義します。この行は、このままにしておいて構いません。
2番目のセクションでは、P2Pアプリケーションが管理するリソースを定義します。このセクションは、編集する必要があります。リスト1では、share とtmp の2つのリソースを定義しています。アプリケーションの観点からは、リソースは、Resource インターフェースを実装するクラスのインスタンスにすぎません。このインターフェースについては、後で簡単に検討します。リソース定義の一般形式は次のとおりです。
リスト2. リソース定義
com.etcee.app.ki.resource.0.name=<name>
com.etcee.app.ki.resource.0.class=<implementation class>
com.etcee.app.ki.resource.0.arg0=<initialization argument>
com.etcee.app.ki.resource.0.arg1=<initialization argument>
.
.
|
name はリソースに与えられた名前であり、人間が読める出力を生成するために使用されます。class は、リソースを作成するためにインスタンス化されたJavaクラスの名前です。P2Pアプリケーションは実行時にこのクラスを動的にロードし、インスタンス化します。argN 引数は、初期化の間に新しくインスタンス化されたリソースに渡されます。FileResource クラスはこれらの引数を使用して、ファイル提供元などとして使用されるディレクトリーを定義します。このディレクトリー引数については、編集したうえで、あなたのマシンにあるディレクトリーを指すようにする必要があります。
3番目のセクションでは、このP2Pアプリケーションが認識するピアを定義します。各行には、1つのピアの名前 (またはIPアドレス) とポートが入ります。このようにしてピアを定義することは、スケーラブルなソリューションでないことは明らかです。将来の記事で、より優れた代替手段を検討する予定です。
コード
私がピアツーピア通信用に採用したSPP (Simple Point-to-Point) パッケージ以外の部分では、このP2Pアプリケーションに含まれているクラスは多くありません。最初に最も重要ないくつかのクラスを詳しく説明してから、最後にSPP通信パッケージについて説明します。
リソース
このP2Pアプリケーションの中心となるコンポーネントはリソースです。事実、P2Pアプリケーションは、公開されたリソースへのリモート・アクセスを可能にし、それを制御することのほかには、たいしたことは何もしません。アドレス指定可能であれば、ファイル・システム、電話帳、データベース、あるいはディレクトリーなど、何でもリソースにすることができます。それぞれのリソースは、適切なタイプの項目 (ファイル・システムの場合にはファイル、電話帳の場合には番号) を管理します。
リソースの実装を説明するために、リスト3に示すような単純なファイル・システム・リソース・クラスFileResource を作成しました。このファイル・システム・リソースは、ファイルを管理します。
リスト3.Resource インターフェース
public
interface Resource
{
// The initialize() method requires a TTDFactory instance
// (which the factory uses to create the TTDItem instances
// it returns from the select() method in response to a
// query) and a String array (which contains the arguments
// from the configuration file).
public
void
initialize(TTDFactory ttdfactory, String [] arstring)
throws ResourceException;
// The select() method requires a String instance that
// defines the selection criteria. It returns an array
// of TTDItems, one for each entry that matches the
// selection criteria.
public
TTDItem []
select(String stringSelector)
throws ResourceException;
}
|
リソースの構造と振る舞いはResource インターフェースによって定義されます。このインターフェースは、リソースで実行される可能性のある操作を定義します。操作のリストには、現在select が含まれています。将来の実装版では、insert およびdelete も含める予定です。
select() メソッドは、選択基準を定義するストリングをパラメーターとして取り入れます。このメソッドは、選択基準に一致するすべてのリソース項目に関する情報を戻します。現在、このP2Pアプリケーションに組み込まれたファイル・システム・リソースによって実装されている選択ストリングでは、項目の名前を直接指定することも (この場合、リソースは項目自体とその関連メタデータを戻します)、ワイルドカード "*" を使用することもできます (この場合、リソースは、管理するすべての項目のメタデータだけを戻します)。より複雑な照会言語を使用することも可能ですが、この記事で扱う範囲を超えています。
シェル
Shell クラスは、ユーザーがローカルおよびリモートのリソースをブラウズできるようにするための、きわめて単純なコマンド行ユーザー・インターフェースにすぎないと言って差支えありません。これは、PeerReference、ResourceReference、およびItemReference クラスを使用して他のピアに要求を送信しますが、ユーザー入力自体の構文解析以外には、ほとんど何も行いません。
要求側のピアから通信がどのように機能するのかを理解しやすくするために、リスト4 に示すPeerReference クラスの一部を見てみましょう。
シェルとのユーザー対話については先月説明しましたので、ここでは繰り返しません。P2Pアプリケーションを初めて起動する前に、ここで一休みして、その操作を復習しておきましょう。
通信
ピア間の通信は、P2Pの主要機能です。おそろしく原始的なNapsterプロトコルに慣れている人は、なぜ私がそれよりもやや現代的なプロトコルを選択したのかを理解してくれるでしょう。ここでは、SPPについては簡単にしか触れません。P2P通信に関する今後の記事の中で、さらに詳しく説明する予定です。
SPPは、図1に示すように、メッセージを一連のフレームとしてモデル化しています。
図1. メッセージ
メッセージ内の各フレームには、タイプ (MIMEタイプによって表されます) と本体があります。フレームには、オプションで、本体内のデータを説明するヘッダーを含めることができます。
完全で正しいメッセージを構成する一連のフレームのタイプは、アプリケーションによって異なります。一般的には、メッセージは、1つの制御フレームにデータ・フレームが続いたものです。データ・フレームには、制御フレームによって参照されるデータが含まれます。私たちのP2Pアプリケーションはこのパターンに従っています。
メッセージは要求 / 応答のペアで発生します。あるピアが別のピアに要求を送信します。要求を受け取ったピアは、最初のピアに応答を送信します。
要求メッセージ内の制御フレームはコマンド・フレームです。これには、コマンドとそのコマンドへのパラメーターが含まれます。追加フレームが存在する場合、それらのフレームには、コマンド・フレームによって必要とされる情報が含まれます。
応答メッセージ内の制御フレームは状況フレームです。これには、状況 (okまたはerror) が入ります。追加フレームが存在する場合、それらのフレームには、状況フレームによって参照される情報が含まれます。ファイル・システム・リソースへの要求の場合、この情報は、選択されたファイルの内容からなります。
マルチフレーム・メッセージ・モデルの利点は、通信を行うアプリケーション間で内容の豊かなメッセージを交換できることです。SPPは、多くの点でBXXPに似ています (参考文献を参照)。
結論
フレームワークについてしっかり理解してもらえたと思いますので、来月のP2Pセキュリティーの説明に進む準備ができました。私たちのP2Pアプリケーションへのセキュリティー・サポートの組み込みも行う予定です。
参考文献
著者について  | |  | Todd Sundsted氏は、コンピューターがデスクトップ上で利用できるようになったころから、プログラムを作成し続けてきました。Todd氏は、元々C++ を使って分散アプリケーションを作成することに関心がありましたが、Javaプログラミング言語がプログラミング言語として採用されることが多くなったのをきっかけに、Javaプログラミング言語の方に進みました。プログラム作成者であるだけでなく、PointFire, Inc. の共同設立者兼チーフ・アーキテクトでもあります。氏の連絡先は、todd-p2p@etcee.com です。
|
記事の評価
|