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”尝试注册服务,一般情况下,它可能会得到两个结果:服务“注册成功”和“注册失败”。在这两种情况下,“DNSSD.register”都会调用作为最后一个参数提供给 DNSSD.register 的对象的相应方法(“serviceRegistered”或“operationFailed”)。程序员决定将什么放入“serviceRegistered”和“operationFailed”。很明显。

但是我应该尝试从“operationFailed”注册服务吗?恐怕这样我的应用程序会过于频繁地尝试注册服务。我应该在“操作失败”中添加一些“睡眠”还是“暂停”?但无论如何,在我看来,当应用程序无法注册服务时,它也将无法做其他事情(例如处理 GUI)。或者可能是 DNSSD.register 引入了某种并行性?我的意思是它启动了一个新线程,但是如果我尝试从“操作失败”注册服务,我可以生成大量线程。会发生吗?如果是这种情况,它应该是一个问题吗?如果是这样,我该如何解决这个问题?

4

1 回答 1

1

是的,来自 DNSSD API 的回调可以异步地来自另一个线程。O'Reilly 关于 ZeroConf 网络的书的这段摘录提供了一些有用的信息。

我不确定从您的 operationFailed 回调中重试注册是个好主意。至少在不了解注册失败的原因的情况下,只是用相同的参数重试是否有意义?

于 2010-03-08T15:27:14.610 回答