金曜日, 3月 23, 2007

続 bonjour by Java

次は、Bonjourを使ってローカルリンク上にサービスを通知してみます。

今回通知するサービスは、_testとし、このサービスはTCPの6666番ポートを使っていると仮定します。

さらに、サービスを行っているノードを識別するインスタンス名を_QuBEとします。

すなわち、_QuBE._test._tcp.localとしてサービスを通知します。

このプログラムは以下のようになります。

import com.apple.dnssd.*;

public class Main implements RegisterListener {
DNSSDRegistration r;

public Main() {
}

public void serviceRegistered(DNSSDRegistration registration, int flags,
String serviceName, String regType, String domain) {
System.out.println("serviceName = " + serviceName);
System.out.println("regType = " + regType);
System.out.println("domain = " + domain);
}

public void operationFailed(DNSSDService service, int errorCode) {

}

public void register(String name, int port) {
try {
r = DNSSD.register(name, "_test._tcp", port, this);
} catch (Exception e){
e.printStackTrace();
System.exit(-1);
}
}

public static void main(String[] args) {
Main m = new Main();

m.register("QuBE", 6666);

for (;;) {
try {
Thread.sleep(100);
} catch (Exception e){
e.printStackTrace();
System.exit(-1);
}
}
}
}

DNSSD.register(name, "_test._tcp", port, this); が、サービスを通知、登録するための関数になります。
ここでは、nameがサービスのインスタンス名、"_test._tcp"がサービスタイプ、portがそのサービスを提供しているポート番号となります。
最後の引数、thisでは、リスナクラスを登録する必要があり、このクラスはRegisterListenerインターフェースをインプリメントしていなければいけません。

RegisterListenerインターフェースをインプリメントするには、serviceRegistered関数と、operationFailed関数を定義する必要があります。
これらは、サービスの登録が成功したとき、もしくは失敗したときに呼び出されます。

それでは、このプログラムを実行してみます。

実行する前に、dns-sdをターミナルで動かしておきます
% dns-sd -B _test._tcp

この後、上記プログラムを実行すると、dns-sdでは、以下のようなメッセージが表示されます。
Browsing for _test._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
13:07:47.146 Add 2 8 local. _test._tcp. QuBE
13:07:47.148 Add 2 9 local. _test._tcp. QuBE
13:07:47.148 Add 2 5 local. _test._tcp. QuBE

また、プログラムの実行結果は以下のようになります。
serviceName = QuBE
regType = _test._tcp.
domain = local.

0 件のコメント: