今回通知するサービスは、_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 件のコメント:
コメントを投稿