月曜日, 3月 19, 2007

bonjour by Java

BonjourをJavaで使ってみます。
Bonjourの詳しい説明はこちら(Wikipedia)。

Bonjourでは、サービスタイプという概念があります。
たとえば、iTunesでは、_daap._tcpというサービスタイプが用いられています。
他には、_http._tcpや、_printer._udpなどがあります。

PCは_http._tcpというサービスを提供していることを、リンクローカルマルチキャスを用いて知らせます。

dns-sdを利用すると、同一セグメント上に流れてきているサービスを、表示することができます。
例えば、_daap._tcpというサービスが流れてきているかどうかを表示するには以下のようにします。
 % dns-sd -B _daap._tcp

この後、iTunesを起動してみると、次のようなメッセージが表示されます。
Browsing for _daap._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
3:03:01.323 Add 3 8 local. _daap._tcp. QuBE
3:03:01.324 Add 3 9 local. _daap._tcp. QuBE
3:03:01.324 Add 2 5 local. _daap._tcp. QuBE

次に、これと似たようなことを、Javaで実装してみます。
コードは以下のようになります。
import java.util.*;
import com.apple.dnssd.*;

public class bonjourTest implements BrowseListener {

public bonjourTest() {}

public void serviceFound(DNSSDService browser, int flags, int ifIndex,
String serviceName, String regType, String domain) {
System.out.println("Sercice Founded");
System.out.println("name = " + serviceName);
System.out.println("registered type = " + regType);
System.out.println("domain = " + domain);
}

public void serviceLost(DNSSDService browser, int flags, int ifIndex,
String serviceName, String regType, String domain) {
System.out.println("Service Lost");
System.out.println("name = " + serviceName);
System.out.println("name = " + serviceName);
System.out.println("registered type = " + regType);
System.out.println("domain = " + domain);
}

public void operationFailed(DNSSDService service, int errorCode) {

}

public static void main (String args[]) {
bonjourTest b = new bonjourTest();

try {
DNSSD.browse("_daap._tcp", b);

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

DNSSD::browse() 関数を用いて、取得するサービスタイプを指定し、サービスが取得されたときのリスナクラスを指定します。
このリスナクラスは、BrowseListenerインターフェースをインプリメントし、serviceFound(), serviceLost(), operationFailed()関数を定義することで出来上がります。

DNSSDクラスはファクトリクラスとなっており、ここで定義された関数を用いることで、サービスの登録なども行えます。

上記のプログラムを実行して、iTunesを起動すると、以下のようなメッセージが表示されます。
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.

0 件のコメント: