0

これは、Bonjour を使用し、Java で記述された単純なサーバー アプリケーションです。コードの主要部分は次のとおりです。

public class ServiceAnnouncer implements IServiceAnnouncer, RegisterListener {
    private DNSSDRegistration serviceRecord;
    private boolean registered;

    public boolean isRegistered(){
        return registered;
    }

    public void registerService()  {
        try {
            serviceRecord = DNSSD.register(0,0,null,"_killerapp._tcp", null,null,1234,null,this);
        } catch (DNSSDException e) {
            // error handling here
        }
    }

    public void unregisterService(){
        serviceRecord.stop();
                registered = false;
    }

    public void serviceRegistered(DNSSDRegistration registration, int flags,String serviceName, String regType, String domain){
        registered = true;
    }

    public void operationFailed(DNSSDService registration, int error){
        // do error handling here if you want to.
    }
}

以下のように理解しています。「registerService」メソッドを呼び出すサービスの登録を試みることができます。このメソッドは、「DNSSD.register」メソッドを呼び出します。「DNSSD.register」はサービスを登録しようとしますが、通常、サービスは「登録に成功しました」と「登録に失敗しました」という 2 つの結果になる可能性があります。どちらの場合も、「DNSSD.register」は、最後の引数として DNSSD.register に与えられたオブジェクトの対応するメソッド (「serviceRegistered」または「operationFailed」のいずれか) を呼び出します。そしてプログラマーは、「serviceRegistered」と「operationFailed」に何を入れるかを決定します。明らかです。

しかし、「operationFailed」からサービスを登録しようとする必要がありますか? この方法では、アプリケーションがサービスを頻繁に登録しようとするのではないかと心配しています。「操作失敗」に「スリープ」または「一時停止」を入れる必要がありますか? しかし、いずれにせよ、アプリケーションがサービスを登録できない場合、他のこともできないように思えます (たとえば、GUI の処理など)。または、DNSSD.register がある種の並列処理を導入する可能性がありますか? つまり、新しいスレッドを開始しますが、「操作に失敗しました」からサービスを登録しようとすると、膨大な数のスレッドが生成される可能性があります。それは起こり得ますか?もしそうなら、それは問題になるべきですか?その場合、どうすればこの問題を解決できますか?

4

1 に答える 1

1

はい、DNSSD API からのコールバックは、別のスレッドから非同期的に来る可能性があります。ZeroConf ネットワーキングに関する O'Reilly の本からのこの抜粋は、いくつかの有用な情報を提供します。

operationFailed コールバックから登録を再試行するのが良い考えかどうかはわかりません。少なくとも、登録が失敗した理由をある程度理解することなく、同じパラメーターで再試行するだけで意味があるのでしょうか?

于 2010-03-08T15:27:14.610 に答える