这是一个使用 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 引入了某种并行性?我的意思是它启动了一个新线程,但是如果我尝试从“操作失败”注册服务,我可以生成大量线程。会发生吗?如果是这种情况,它应该是一个问题吗?如果是这样,我该如何解决这个问题?