第2回 JXTA-ShellとJXTA Java APIの関連


なぜ、対応しない部分が存在するのか?

 JXTA-ShellのコマンドとJXTA Java APIとの関係の一端を見てきましたが、receiver.java、sender.javaという2つのJavaプログラムの中の一部に、先に見たJXTA-Shellのコマンド列には対応するものの、ないシーケンスが含まれていることに注目してください。それは、ある意味では、これら2つのJXTAプログラムの最も特徴的な部分といってもいい、「告知」の公開・獲得にかかわる次のような部分です。

 以前にも見たように、メッセージの「受け手」はパイプ告知を含むサービス告知を生成して、それをネットワーク上に公開します。メッセージの「送り手」はネットワーク上で公開されている「告知」を獲得し、その情報を基にして出力用のパイプを生成します。

 「受け手」側の「告知」公開
discovery.publish(serviceAdv, Discovery.ADV); // ローカル・キャッシュへの公開。
discovery.remotePublish(serviceAdv, Discovery.ADV); // ネットワーク上での公開。

「送り手」側の「告知」獲得
enum = discovery.getLocalAdvertisements(Discovery.ADV, "Name", "Maruyama-1");
discovery.getRemoteAdvertisements(null, Discovery.ADV, "Name", "Maruyama-1",1);

  なぜ、この部分がJXTA-Shellのコマンドでは欠けていたかを考えてみてください。その理由は、2つのJXTA-Shellコンソールを作って行ったメッセージ転送実験の手順の中にあります。今回は、2つのコンソールを作る以前に、pipeadv = mkadv -pで、パイプ告知を作って、それからコンソールを分割しました。ということは、このパイプ告知は2つのJXTA-Shellコンソールで最初から共有されていたので、わざわざ、公開・獲得の手順を踏む必要がなかったのです。

「告知」の公開と獲得に、shareとsearchを使う

 それでは、最初からShell -s でコンソールが2つに分かれている状態で、パイプを使った通信はどのようにしたらいいかを見ていきましょう。

 まず、情報を受け取る(サーバ)側と送る(クライアント)側を決めます。受け取る側でpadv = mkadv -p marupipeのようにしてパイプ告知を作ります。ここでmarupipeは、このパイプ告知の名前(name)になります。そして受け取る側で、このパイプ告知を公開します。公開するにはコマンドshareをshare padvのように使います。

 「受け手」側では、このパイプ告知を利用して入力用のパイプを作ります(ip = mkpipe -i padv)。「送り手」側では、searchコマンドを使って公開されている「告知」がないかを検索します。引数なしのsearchコマンドは、ローカルに公開されているすべての「告知」を検索します。search -rコマンドはネットワーク上で公開されている「告知」を検索します。searchコマンドでは、次のような形で条件付きの検索も可能です。

JXTA>search -r -aname -vmaru*
JXTA Advertisement adv0 (Search criteria: Attribute="name" Value="maru*")
JXTA>cat adv0
<?xml version="1.0"?>

<!DOCTYPE jxta:PipeAdvertisement>

<jxta:PipeAdvertisement>
<id>
jxta://59616261646162614A757874614D5047C18FBA77694F4C90875
AB83C3FBBC1C2000000000 000000000000000000000000000000000
0000000000000000000401
</id>
<name>
marupipe
</name>
</jxta:PipeAdvertisement>
JXTA>

 「送り手」側では、獲得されたパイプ告知を使って出力用のパイプを作ります(op = mkpipe -o adv0)。あとは、これまで見てきたやり方で、メッセージの通信が可能となります。このshareとsearchの2つのコマンドを使うと、以前にJavaで書いたメッセージ転送のプログラムとほぼ同じことをJXTA-Shellの内部で実現できます。

「告知」をJXTA-Shellコマンドから獲得する

 当然といえば当然のことですが、Java APIから発行された「告知」とコマンドから発行される「告知」とに違いがあるわけではありません。これが、JXTAがプロトコル中心で、言語のbindingから自由であるということですので、それを確かめておきましょう(この例は、どちらもJavaで書かれたコマンドでしたね)。

 まず、Javaで書いたreceiverコマンドを起動します。

JXTA>receiver
Service advertisement was published
Waiting ......

 このプログラムのソースの一部を、今度はコメント付きで再掲します。パイプ告知を1つ生成して、それに、Pipe Maruyama-1という名前を付けます。これは、padv = mkadv -p "Pipe Maruyama-1"というコマンドに相当するのですが、JXTA-Shellは、引数のパージングを手抜きしているので、内部にスペースを含んだ文字列をquoteすることができません。

 このプログラムでは、パイプ告知を公開しているだけでなくパイプ告知を含んだサービス告知をキチンと生成して、それを公開しています。サービス告知には、パイプ告知のほかに、サービスの名前とか、サービスの提供者の名前、サービスのバージョンなどを指定しています。

// パイプ・サービス告知を生成して、告知に必要なパラメータを設定する。
PipeAdvertisement pipeAdv = (PipeAdvertisement)
AdvertisementFactory.newAdvertisement("jxta:PipeAdvertisement");
pipeAdv.setName("Pipe Maruyama-1"); // パイプ・サービスの名前の設定
// ネット・ピア・グループのIDは、ユニークであることが保証されているので、
// それを使って、ユニークなパイプIDを生成し、設定する。
pipeAdv.setPipeID(new PipeID(group.getID()));

// サービス告知を生成して、告知に必要なパラメータを設定する。
ServiceAdvertisement serviceAdv = (ServiceAdvertisement)
AdvertisementFactory.newAdvertisement("jxta:ServiceAdvertisement");
serviceAdv.setName("Maruyama-1"); // サービスの名前の設定
serviceAdv.setProvider("wakhok.ac.jp"); // サービスのプロバイダ名の設定
serviceAdv.setVersion("Version 1.0"); // サービスのバージョン設定
// サービス告知の中にパイプ・サービス告知を設定する。
serviceAdv.setPipe(pipeAdv);

searchコマンドの利用

 こうした公開されたサービス告知を、JXTA-Shellのsearchコマンドで検索します。次の例は、同じマシン上の2つのコンソールでの実験例ですので、searchコマンドを使っていますが、shareコマンドを発行したマシンが、searchコマンドを発行するマシンと異なる場合には、search -rが必要です。

 searchコマンドを実行すると、発見された「告知」の一覧が表示されます。この例では、adv0からadv14まで15個の「告知」が見つかっています。このように、searchコマンドの出力は、\verb-adv+###-という形をした自動生成された変数に割り当てられます。

JXTA> search
JXTA Advertisement adv0
JXTA Advertisement adv1
JXTA Advertisement adv2
JXTA Advertisement adv3
JXTA Advertisement adv4
JXTA Advertisement adv5
JXTA Advertisement adv6
JXTA Advertisement adv7
JXTA Advertisement adv8
JXTA Advertisement adv9
JXTA Advertisement adv10
JXTA Advertisement adv11
JXTA Advertisement adv12
JXTA Advertisement adv13
JXTA Advertisement adv14
JXTA>

 このままでは、どのような「告知」が獲得されたかは分かりません。一番簡単なのは、catコマンドで変数を出力させることです。この例では、最初の変数が、求めるものだということが分かっていました。catの出力を先のJavaの「告知」生成のコードと比較してみてください。

JXTA>cat adv0
<?xml version="1.0"?>

<!DOCTYPE jxta:ServiceAdvertisement>

<jxta:ServiceAdvertisement>
<Name>
Maruyama-1
</Name>
<Version>
Version 1.0
</Version>
<Keywords>
</Keywords>
<PipeService>
<jxta:PipeAdvertisement>
<id>
jxta://59616261646162614A757874614D5047026067DC59464DE09FF387569DA7EF8
00000000000000000000000000000000000000000000000000000000000000401
</id>
<name>
Pipe Maruyama-1
</name>
</jxta:PipeAdvertisement>
</PipeService>
<Uri>
</Uri>
<Provider>
wakhok.ac.jp
</Provider>
<Security>
</Security>
<Code>
</Code>
</jxta:ServiceAdvertisement>
JXTA>

 これで、JXTA-ShellコマンドとJXTA Java APIでの、「告知」の公開と獲得をめぐる対応関係は、明らかになったと思います。

 次回は、JXTA-Shellのコマンドのソースを読んで、JXTA Javaでのプログラミングの基本的なスタイルを学ぶとともに、JXTA-Shellコマンドの働きを、すこし掘り下げて理解することを目指したいと思います。

 


Index
  Page1
●JXTA Shellのメッセージ通信のまとめ
●receiver.javaとsender.java
●「受け手」のスクリプトとreceiver.javaの比較
●「送り手」のスクリプトとプログラムsender.javaの比較
Page2
●なぜ、対応しない部分が存在するのか?
●「告知」の公開と獲得に、shareとsearchを使う
●「告知」をJXTA-Shellコマンドから獲得する

●searchコマンドの利用


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間