这是simple server application using Bonjour and written in 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”调用对象的相应方法(“serviceRegistered”或“operationFailed”),该方法作为最后一个参数提供给DNSSD.register。程序员决定将什么放入“serviceRegistered”和“operationFailed”。很明显。
但是我应该尝试从“operationFailed”注册服务吗?我担心这样我的应用程序会尝试过于频繁地注册服务。我应该在“operationFailed”中加入一些“睡眠”或“暂停”吗?但无论如何,在我看来,当应用程序无法注册服务时,它也将无法执行其他操作(例如,处理GUI)。或者可能是DNSSD.register引入某种并行性?我的意思是它启动一个新的线程,但如果我尝试从“操作失败”注册服务,我可以生成大量的线程。会发生吗?如果是这样的话,它应该是一个问题吗?如果是这样,我该如何解决这个问题?
答案 0 :(得分:1)
是的,来自DNSSD API的回调可以从另一个线程异步进行。这个exerpt from the O'Reilly book on ZeroConf networking提供了一些有用的信息。
我不确定从您的operationFailed回调重试注册是一个好主意。至少在没有理解注册失败原因的情况下,只是用相同的参数重试它才有意义吗?